• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
简单不先于复杂,而是在复杂之后
博客园    首页    新随笔    联系   管理    订阅  订阅
第五章---串和数组
关于串和数组。。。
随机稀疏矩阵的存储压缩
展开#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 发随笔

posted on 2011-04-08 14:54  sharpCode  阅读(372)  评论(2)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3