关于串和数组。。。
随机稀疏矩阵的存储压缩
展开#include <stdio.h> #include <stdlib.h> #define MAXSIZE 1000 #define OK 1 typedef int status; typedef int ElemType; typedef struct { int i,j; ElemType e; }Triple; typedef struct { Triple data [MAXSIZE+1]; //data[0] 不用 int mu,nu,tu; }TSMatrix; int num[100]; int rpos[100]; void createpos(TSMatrix M) { int col;int t; for(col=1;col<=M.nu;col++) { num[col]=0; } for(t=1;t<=M.tu;t++) { ++num[M.data[t].j]; } rpos[1]=1; for(col=2;col<=M.nu;col++) { rpos[col]=rpos[col-1]+num[col-1]; } } status FastTransposeSMatrix(TSMatrix M,TSMatrix *T) { int p; int col; int q; T->mu=M.nu;T->nu=M.mu;T->tu=M.tu; if(M.tu) { createpos(M); for (p=1;p<=M.tu;p++) { col=M.data[p].j;q=rpos[col]; T->data[q].i=M.data[p].j; T->data[q].j=M.data[p].i; T->data[q].e=M.data[p].e; ++rpos[col]; } } return OK; } void main() { int p; int N[8][3]={{1,2,12},{1,3,9},{3,1,-3},{3,6,14}, {4,3,24},{5,2,18},{6,1,15},{6,4,-7}}; //稀疏矩阵M的三元组序列存放在二维数组N中 TSMatrix M,T; M.mu=6; M.nu=7; M.tu=8; for(p=1;p<=M.tu;p++) { M.data[p].i=N[p-1][0]; M.data[p].j=N[p-1][1]; M.data[p].e=N[p-1][2]; } printf("转置前:\n"); for(p=1;p<=M.tu;p++) { printf("%4d%4d%4d\n",M.data[p].i,M.data[p].j,M.data[p].e); } FastTransposeSMatrix(M,&T); printf("转置后:\n"); for(p=1;p<=M.tu;p++) { printf("%4d%4d%4d\n",T.data[p].i,T.data[p].j,T.data[p].e); } }
串的相关操作1
展开#include <stdio.h> #include <stdlib.h> int StrLength(char str[]) { int length=0; int i=0; while(str[i]!='\0') { length++; i++; } return length; } void SubString(char sub[],char str[],int pos,int len) { int i; if(len==0) { sub[0]='\0'; } if(pos<=StrLength(str) && pos>0 && len>0 && len<=StrLength(str)-pos+1) { for(i=0;i<len;i++,pos++) sub[i]=str[pos-1]; sub[i]='\0'; } } int StrCompare(char *str1,char *str2) { int i=0; while(str1[i]!='\0' && str2[i]!='\0') { if(str1[i]>str2[i]) return 1; if(str1[i]<str2[i]) return -1; i++; } if(str1[i]!='\0') return 1; if(str2[i]!='\0') return -1; return 0; } int Index(char str[],char instr[]) { int strLength=StrLength(str); int instrLength=StrLength(instr); int pos=1; char sub[100]; while(pos<=strLength-instrLength+1) //如果pos>strLength-instrLength+1,那么SubString肯定找不到一个长度为instrLength的字符串 { SubString(sub,str,pos,instrLength); if(StrCompare(sub,instr)!=0) ++pos; else return pos; } return 0; //如果没有找到,返回0 } void StrAssign(char Temp[] ,char Str[]) { int i=0; while(Str[i]!='\0') { Temp[i]=Str[i]; i++; } Temp[i]='\0'; } void Concat(char Temp[],char str1[],char str2[]) { int i=0; int str1Len=StrLength(str1); int str2Len=StrLength(str2); while(*str1!='\0') Temp[i++]=*str1++; while(*str2!='\0') Temp[i++]=*str2++; Temp[i]='\0'; } void Replace(char str[],char T[],char V[]) //用V替换主串str中出现的所有与T相等的子串 { int k; char temp[100]; char result[100]; int strLen=StrLength(str); int Tlen=StrLength(T); char sub[100]; k=Index(str,T); if(k) { while(k) { SubString(sub,str,1,k-1); Concat(temp,sub,V); strLen-=(k-1)+Tlen; //新的str的长度 SubString(sub,str,k-1+Tlen,strLen); StrAssign(str,sub); //新的str k=Index(str,T); } Concat(result,temp,str); StrAssign(str,result); } } void main() { char s[100]="I AM A STUDENT"; char t[100]="GOOD"; char q[100]="WORKER"; char sub[100]; char sub1[100]; char sub2[100]; char temp[100]; char ltemp[100]; printf("StrLength(s)=%d\n",StrLength(s)); printf("StrLength(t)=%d\n",StrLength(t)); SubString(sub,s,8,7); printf("SubString(s,8,7)=%s\n",sub); SubString(sub,t,2,1); printf("SubString(t,2,1)=%s\n",sub); printf("Index(s,\"A\")=%d\n",Index(s,"A")); printf("Index(s,t)=%d\n",Index(s,t)); SubString(sub1,s,6,2); SubString(sub2,s,7,8); Concat(temp,t,sub2); Concat(ltemp,sub1,temp); printf("Concat(SubString(s,6,2),Concat(t,SubString(s,7,8)))=%s\n",ltemp); Replace(s,"STUDENT",q); printf("Replace(s,\"STUDENT\",q)=%s\n",s); }
串的相关操作2
展开#include <stdio.h> #include <stdlib.h> int StrLength(char str[]) { int length=0; int i=0; while(str[i]!='\0') { length++; i++; } return length; } void SubString(char sub[],char str[],int pos,int len) { int i; if(len==0) { sub[0]='\0'; } if(pos<=StrLength(str) && pos>0 && len>0 && len<=StrLength(str)-pos+1) { for(i=0;i<len;i++,pos++) sub[i]=str[pos-1]; sub[i]='\0'; } } int StrCompare(char *str1,char *str2) { int i=0; while(str1[i]!='\0' && str2[i]!='\0') { if(str1[i]>str2[i]) return 1; //字典中靠后的比较大 if(str1[i]<str2[i]) return -1; i++; } if(str1[i]!='\0') return 1; //字典中靠后的比较大 if(str2[i]!='\0') return -1; return 0; //字符串一样 } int Index(char str[],char instr[]) { int strLength=StrLength(str); int instrLength=StrLength(instr); int pos=1; char sub[100]; while(pos<=strLength-instrLength+1) //如果pos>strLength-instrLength+1,那么SubString肯定找不到一个长度为instrLength的字符串 { SubString(sub,str,pos,instrLength); if(StrCompare(sub,instr)!=0) ++pos; else return pos; } return 0; //如果没有找到,返回0 } void StrAssign(char Temp[] ,char Str[]) { int i=0; while(Str[i]!='\0') { Temp[i]=Str[i]; i++; } Temp[i]='\0'; } void Concat(char Temp[],char str1[],char str2[]) { int i=0; int str1Len=StrLength(str1); int str2Len=StrLength(str2); while(*str1!='\0') Temp[i++]=*str1++; while(*str2!='\0') Temp[i++]=*str2++; Temp[i]='\0'; } void Replace(char str[],char T[],char V[]) //用V替换主串str中出现的所有与T相等的子串 { int k; char temp[100]; char result[100]; int strLen=StrLength(str); int Tlen=StrLength(T); char sub[100]; k=Index(str,T); if(k) { while(k) { SubString(sub,str,1,k-1); Concat(temp,sub,V); strLen-=(k-1)+Tlen; //新的str的长度 SubString(sub,str,k-1+Tlen,strLen); StrAssign(str,sub); //新的str k=Index(str,T); } Concat(result,temp,str); StrAssign(str,result); } } void main() { char a[100]="THIS"; char f[100]="A SAMPLE"; char c[100]="GOOD"; char d[100]="NE"; char b[100]=" "; char g[100]="IS"; char s[100],t[100],u[100],v[100]; char tempb[100],tempf[100],tempt[100],subf[100],suba[100],subc[100]; SubString(subf,f,2,7); SubString(suba,a,3,2); Concat(tempb,b,suba); Concat(tempf,subf,tempb); Concat(s,a,tempf); printf("s=%s\n",s); SubString(subf,f,3,6); Replace(f,subf,c); StrAssign(t,f); printf("t=%s\n",t); SubString(subc,c,3,1); Concat(u,subc,d); Concat(tempb,b,u); Concat(tempt,f,tempb); Concat(tempb,b,tempt); Concat(v,s,tempb); printf("v=%s\n",v); printf("StrLength(s)=%d\n",StrLength(s)); printf("Index(v,g)=%d\n",Index(v,g)); printf("Index(u,g)=%d\n",Index(u,g)); }
删除串s中所有t子串
展开#include <stdio.h> #include <stdlib.h> #include <string.h> char *strdel(char str[],char t[]) { char *p=strstr(str,t); int tlen=strlen(t); int i; if(p) { while(p!=NULL) { i=0; while(p!=&str[i++]); i--; p=p+tlen; while(*p!='\0') { str[i++]=*p++; } str[i]='\0'; p=strstr(str,t); } return str; } else { return NULL; } } void main() { char s[100]="Im a student,you are a student,too"; char t[100]="student"; strdel(s,t); printf("%s\n",s); }
矩阵相加
展开#include <stdio.h> #include <stdlib.h> #define MAXSIZE 1000 typedef int ElemType; typedef struct { int i,j; ElemType e; }Triple; typedef struct { Triple date[MAXSIZE+1]; int mu,nu,tu; }TSMatrix; void initTSMatrix(TSMatrix *T,int m,int n) { int i,j,index; for(i=1;i<=m;i++) { for(j=1;j<=n;j++) { index=(i-1)*n+j; T->date[index].i=i; T->date[index].j=j; T->date[index].e=0; //初始化时矩阵所有元素为0 } } } void MatrixPlus(TSMatrix M,TSMatrix N,TSMatrix *S) { int i,j,index; for(i=1;i<=S->mu;i++) { for(j=1;j<=S->nu;j++) { index=(i-1)*S->nu+j; S->date[index].i=i; S->date[index].j=j; S->date[index].e=M.date[index].e+N.date[index].e; //矩阵对应的元素相加 } } } void printTSMatrix(TSMatrix S) { int i,j,index; for(i=1;i<=S.mu;i++) { for(j=1;j<=S.nu;j++) { index=(i-1)*S.nu+j; if(S.date[index].e!=0) { printf("(%d,%d,%d)\n",S.date[index].i,S.date[index].j,S.date[index].e); //输出所有非零元素 } } } } void main() { int i,j,k,index; int MArray[3][3]={{1,1,1},{2,3,1},{3,1,1}}; int NArray[5][3]={{1,1,1},{2,1,1},{2,3,1},{3,1,1},{3,3,1}}; TSMatrix M,N,S; M.mu=3; M.nu=3; M.tu=3; N.mu=3; N.nu=3; N.tu=5; S.mu=3; S.nu=3; initTSMatrix(&M,M.mu,M.nu); initTSMatrix(&N,N.mu,N.nu); initTSMatrix(&S,S.mu,S.nu); for(k=0;k<M.tu;k++) { i=MArray[k][0]; j=MArray[k][1]; index=(i-1)*M.nu+j; M.date[index].e=MArray[k][2]; } for(k=0;k<N.tu;k++) { i=NArray[k][0]; j=NArray[k][1]; index=(i-1)*N.nu+j; N.date[index].e=NArray[k][2]; } MatrixPlus(M,N,&S); printTSMatrix(S); }
留作记录,努力更新ing。。。。ps:首次尝试用Live Writer 发随笔