⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zhou.cpp

📁 可以实现线性表的基本操作
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	int i,j;
	printf("矩阵为:");
	for(i=0;i<M.mu;i++)
	{
		printf("\n");
		for(j=0;j<M.nu;j++)
			printf("%d\t",M.data[i][j]);
	}
	printf("\n");
}//PrintMatrix

TSMatrix CreatTSMatrix()
//以行序为主序建立三元组表存储的矩阵M
{
	TSMatrix M;
	int mu,nu,tu,i,j,e,k=0,tempi,tempj,tempe;
	do
	{
		printf("输入矩阵的非零元的个数(tu<=100):");
		scanf("%d",&tu);
		getchar();
	}while(!(tu>=0&&tu<=MAXSIZE));
	M.tu=tu;
	do
	{
		printf("输入矩阵的行数(mu<=20):");
		scanf("%d",&mu);
		getchar();
	}while(!(mu>0&&mu<=MAX));
	M.mu=mu;
	do
	{
		printf("输入矩阵的列数(nu<=20):");
		scanf("%d",&nu);
		getchar();
	}while(!(nu>0&&nu<=MAX));
	M.nu=nu;
	while(k<M.tu)
	{
		printf("输入三元组的行下标,列下标和值(i,j,e):");
		scanf("%d,%d,%d",&i,&j,&e);
		getchar();
		while(!(i>=0&&i<M.mu&&j>=0&&j<M.nu))
		{
			printf("非法输入,请再次输入:");
			scanf("%d,%d,%d",&i,&j,&e);
			getchar();
		}
		M.data[k].i=i;
		M.data[k].j=j;
		M.data[k].e=e;
		k++;
	}
	for(k=1;k<tu;k++)
	{
		tempi=M.data[k].i;
		tempj=M.data[k].j;
		tempe=M.data[k].e;
		if(M.data[k-1].i>tempi||(M.data[k-1].i==tempi&&M.data[k-1].j>tempj))
		{
			for(i=k-1;i>=0&&(M.data[i].i>tempi||(M.data[i].i==tempi&&M.data[i].j>tempj));i--)
				M.data[i+1]=M.data[i];
			M.data[i+1].i=tempi;
			M.data[i+1].j=tempj;
			M.data[i+1].e=tempe;
		}//if
	}//for
	return M;
}//CreatTSMatrix

TSMatrix TransTSMatrix(TSMatrix M)
//求矩阵M的快速转置矩阵T
{
	TSMatrix T;
	int col,p,q,num[MAX],cpot[MAX];
	T.mu=M.nu;
	T.nu=M.mu;
	T.tu=M.tu;
	if(T.tu)
	{
		for(col=0;col<M.nu;col++)
			num[col]=0;
		for(p=0;p<M.tu;p++)
			num[M.data[p].j]++;
		cpot[0]=0;
		for(col=1;col<M.nu;col++)
			cpot[col]=cpot[col-1]+num[col-1];
		for(p=0;p<M.tu;p++)
		{
			col=M.data[p].j;
			q=cpot[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;
			cpot[col]++;
		}//for
	}//if
	return T;
}//TransTSMatrix

RLSMatrix CreatRLSMatrix(TSMatrix M)
//将三元组表存储的矩阵M转化为行逻辑链接的顺序表
{
	RLSMatrix T;
	int i,num[MAX];
	T.mu=M.mu;
	T.nu=M.nu;
	T.tu=M.tu;
	for(i=0;i<M.tu;i++)
		T.data[i]=M.data[i];
	for(i=0;i<T.mu;i++)
		num[i]=0;
	for(i=0;i<M.tu;i++)
		num[M.data[i].i]++;
	T.rpos[0]=0;
	for(i=1;i<M.mu;i++)
		T.rpos[i]=T.rpos[i-1]+num[i-1];
	return T;
}//CreatRLSMatrix

RLSMatrix MultRLSMatrix(TSMatrix M,TSMatrix T)
//求矩阵乘积Q=M*T,采用行逻辑链接存储表示
{
	RLSMatrix Q,A,B;
	int i,arow,ctemp[MAX],tp,p,brow,t,q,ccol;
	A=CreatRLSMatrix(M);
	B=CreatRLSMatrix(T);
	if(A.nu!=B.mu)
	{
		printf("无法相乘");
			exit(0);
	}
	Q.mu=A.mu;
	Q.nu=B.nu;
	Q.tu=-1;
	if(A.tu*B.tu)
	{
		for(arow=0;arow<A.mu;arow++)
		{
			for(i=0;i<MAX;i++)
				ctemp[i]=0;
			Q.rpos[arow]=Q.tu+1;
			if(arow<A.mu-1)
				tp=A.rpos[arow+1];
			else
				tp=A.tu;
			for(p=A.rpos[arow];p<tp;p++)
			{
				brow=A.data[p].j;
				if(brow<B.mu-1)
					t=B.rpos[brow+1];
				else
					t=B.tu;
				for(q=B.rpos[brow];q<t;q++)
				{
					ccol=B.data[q].j;
					ctemp[ccol]+=A.data[p].e*B.data[q].e;
				}//for q
			}//for p
			for(ccol=0;ccol<Q.nu;ccol++)
			{
				if(ctemp[ccol])
				{
					if(++Q.tu>MAXSIZE)	
						exit(0);
					Q.data[Q.tu].i=arow;
					Q.data[Q.tu].j=ccol;
					Q.data[Q.tu].e=ctemp[ccol];
				}//if
			}//for ccol
		}//for arow
	}//if
	Q.tu++;
	return Q;
}//MultRLSMatrix

void PrintTSMatrix(TSMatrix M)
//以行序为主序顺序输出三元组表存储的矩阵M
{
	RLSMatrix T;
	int i,j,ccol,tp,k;	//ccol作为循环变量,用来访问矩阵每一行的非零元,tp指向没该行最后一个非零元的下一个位置
	T=CreatRLSMatrix(M);
	printf("矩阵为:");
	for(i=0;i<T.mu;i++)
	{
		printf("\n");
		if(i<T.mu-1)
			tp=T.rpos[i+1];
		else
			tp=T.tu;
		for(j=0,ccol=T.rpos[i];ccol<tp;j++)
		{
			if(j!=T.data[ccol].j)
				printf("0\t");
			else
			{
				printf("%d\t",T.data[ccol].e);
				ccol++;
			}//else
		}//for j
		for(k=j;k<T.nu;k++)
			printf("0\t");
	}//for i
}//PrintfTSMatrix

void PrintRLSMatrix(RLSMatrix T)
//以行序为主序顺序输出行逻辑表存储的矩阵T
{
	int i,j,ccol,tp,k;	//ccol作为循环变量,用来访问矩阵每一行的非零元,tp指向没一行最后一个非零元的下一个位置
	printf("\n矩阵为:");
	for(i=0;i<T.mu;i++)
	{
		printf("\n");
		if(i<T.mu-1)
			tp=T.rpos[i+1];
		else
			tp=T.tu;
		for(j=0,ccol=T.rpos[i];ccol<tp;j++)
		{
			if(j!=T.data[ccol].j)
				printf("0\t");
			else
			{
				printf("%d\t",T.data[ccol].e);
				ccol++;
			}//else
		}//for j
		for(k=j;k<T.nu;k++)
			printf("0\t");
	}//for i
}//PrintRLSMatrix

void MenuSqList()		
//顺序表演示系统菜单函数
{
	printf("\n\n\n\n\n\n======================顺序表演示系统====================");
	printf("\n0.结束");
	printf("\n1.初始化顺序表,并为顺序表赋值,表中元素为字符类型");
	printf("\n2.对顺序表简单进行插入排序,使其按ASC码值递增排列");
	printf("\n3.在顺序表L中第i个元素前插入新的元素");
	printf("\n4.在第一个元素值为e的元素前插入新的元素");
	printf("\n5.在顺序表中删除第i个元素");
	printf("\n6.在顺序表中删除元素值为某一特定值的元素");
	printf("\n7.合并顺序表,使Lb直接接在La后面构成顺序表Lc");
	printf("\n选择操作:");
}//MenuSqList

void ShowSqList()		
//顺序表演示系统
{
	SqList La,Lb,Lc,L;
	int i,loc;
	char e;
	while(1)
	{
		MenuSqList();
		scanf("%d",&i);
		getchar();		//清除垃圾字符——回车字符
		while(!((i>=0)&&(i<=7)))
		{
			printf("输入错误,选择操作:");
			scanf("%d",&i);
			getchar();
		}//while(i)	
		switch(i)
		{
		case 0:	return;
		case 1:	L=InitSqList();
			PrintSqList(L);	break;
		case 2: SortSqList(&L);
			PrintSqList(L);	break;
		case 3:	printf("输入位置pos:(0=<pos<=%d)",L.length+1);
			scanf("%d",&loc);
			getchar();
			InsertPositionSqList(&L,loc);
			PrintSqList(L);	break;
		case 4:	printf("输入要在它前面插入元素的元素值:");
			scanf("%c",&e);
			getchar();
			InsertElemSqList(&L,e);
			PrintSqList(L);	break;
		case 5:	DeletePositionSqList(&L);
			PrintSqList(L);	break;
		case 6:	DeleteElemSqList(&L);
			PrintSqList(L);	break;
		case 7:	printf("建立顺序表La,Lb:\n");
			La=InitSqList();	
			PrintSqList(La);
			printf("\n");
			Lb=InitSqList();	
			PrintSqList(Lb);
			Lc=MergeSqList(La,Lb);
			PrintSqList(Lc);	break;
		}//switch(i)
	}//while(1)
}//ShowSqList

void MenuLinkedList()
//链表演示系统菜单
{
	printf("\n\n\n\n\n\n===============链表演示系统==================");
	printf("\n0.退出");
	printf("\n1.建立链表");
	printf("\n2.对链表排序");
	printf("\n3.清空链表");
	printf("\n4.检查链表是否为空");
	printf("\n5.遍历链表 ");
	printf("\n6.求链表的长度");
	printf("\n7.从链表表中查找元素");
	printf("\n8.从链表表中查找与给定元素值相同的元素在链表中的位置");
	printf("\n9. 向链表中插入元素");
	printf("\n10.从链表中删除元素");
	printf("\n11.合并链表La,Lb,使合并后链表有序");
}//MuneLinkedList

void ShowLinkedList()
//链表演示系统
{
	int i,locate,x;
	LinkedList head,La,Lb,p,Lc;
	while(1)
	{
		MenuLinkedList();
		printf("\n选择操作,输入数i(0=<i<=11):");
		scanf("%d",&i);
		while(!((i>=0)&&(i<=11)))
		{
			MenuLinkedList();
			printf("\ni值错误");
			printf("\n选择操作,输入数i(0=<i<=11):");
			scanf("%d",&i);
		}//while(i)
		switch(i)
		{
			case 0:	return;
			case 1:	head=LinkedListCreat();
					LinkedListTraverse(head);	break;	
			case 2:	SortLinkedList(head);
					printf("排序后链表为:");
					LinkedListTraverse(head);	break;
			case 3:	LinkedListClear(head);	break;
			case 4:	if(LinkedListEmpty(head))
						printf("链表为空");
					else
						printf("链表非空");	break;
			case 5:	LinkedListTraverse(head);	break;
			case 6: printf("链表的长度为%d",LinkedListLength(head));	break;
			case 7:	printf("输入位置:");
					scanf("%d",&locate);
					getchar();
					p=LinkedListGet(head,locate);
					if(!p)
						printf("输入非法");
					else
						printf("您要查找的元素是%d",p->data);	break;
			case 8:	printf("输入元素:");
					scanf("%d",&x);
					getchar();
					if(!LinkedListLocate(head,x))
						printf("不存在查找元素");
					else
						printf("元素的位置是%d",LinkedListLocate(head,x));	break;
			case 9:	printf("输入位置pos(1<=pos<=%d):",head->data);
					scanf("%d",&locate);
					getchar();
					printf("输入元素:");
					scanf("%d",&x);
					LinkedListInsert(head,locate,x);
					LinkedListTraverse(head);	break;
			case 10:printf("输入要删除的元素:");
					scanf("%d",&x);
					getchar();
					LinkedListDel(head,x);
					LinkedListTraverse(head);	break;
			case 11:printf("建立链表La:");
					La=LinkedListCreat();
					LinkedListTraverse(La);
					printf("\n建立链表Lb:");
					Lb=LinkedListCreat();
					LinkedListTraverse(Lb);
					Lc=MergeLinkedList(La,Lb);
					printf("\n合并链表La、Lb,并排序后得到");
					LinkedListTraverse(Lc);
		}//switch(i)
	}//while(1)
}//ShowLinkedList

void ShowKMP()
//串的模式匹配演示系统
{
	SqList S,T;
	int pos;
	printf("\t\t\t\t串的模式匹配演示系统\n");
	printf("建立主串:");
	S=InitSqList();
	printf("\n建立模式串:");
	T=InitSqList();
	printf("\n输入主串开始匹配的位置:");
		scanf("%d",&pos);
	if(!IndexKMP(S,T,pos))
		printf("模式匹配不成功");
	else
		printf("模式串在主串中的位置为:%d",IndexKMP(S,T,pos));
}//ShowKMP

void ShowArMatrix()
//二维数组存储结构的矩阵演示系统
{
	int i;
	Matrix M,T,Q;
	printf("\n\n\n\n\n\n===============二维数组存储结构的矩阵演示系统==================");
	printf("\n0.退出");
	printf("\n1.建立二维数组存储结构的矩阵M");
	printf("\n2.求二维数组存储结构的矩阵M的转置矩阵T");
	printf("\n3.求二维数组存储结构的矩阵M和T的乘积矩阵Q");
	while(1)
	{
		printf("\n选择操作:");
		scanf("%d",&i);
		while(!((i>=0)&&(i<=3)))
		{
			printf("输入错误,选择操作:");
			scanf("%d",&i);
		}//while(i)	
		switch(i)
		{
		case 0:	return;
		case 1:	M=CreatMatrix();
			PrintMatrix(M);	break;
		case 2: T=TransMatrix(M);
			PrintMatrix(T);	break;
		case 3:	printf("建立要相乘的矩阵M,T:\n");
			M=CreatMatrix();
			PrintMatrix(M);
			T=CreatMatrix();
			PrintMatrix(T);
			Q=MultMatrix(M,T);
			printf("M*T得到矩阵Q,");
			PrintMatrix(Q);	break;		
		}//switch(i)
	}//while(1)
}//ShowArMatrix

void ShowTSMatrix()
//三元组表存储的矩阵演示系统
{
	TSMatrix M,T;
	RLSMatrix Q;
	int i;
	printf("\n\n\n\n\n\n===============三元组表存储的矩阵演示系统==================");
	printf("\n0.退出");
	printf("\n1.以行序为主序建立三元组表存储的矩阵M");
	printf("\n2.求矩阵M的快速转置矩阵T");
	printf("\n3.求矩阵乘积Q=M*T");
	while(1)
	{
		printf("\n选择操作:");
		scanf("%d",&i);
		while(!((i>=0)&&(i<=3)))
		{
			printf("输入错误,选择操作:");
			scanf("%d",&i);
		}//while(i)	
		switch(i)
		{
		case 0:	return;
		case 1:	M=CreatTSMatrix();
			PrintTSMatrix(M);	break;
		case 2: T=TransTSMatrix(M);
			PrintTSMatrix(T);	break;
		case 3:	printf("建立要相乘的矩阵M,T:\n");
			printf("建立矩阵M:\n");
			M=CreatTSMatrix();
			PrintTSMatrix(M);
			printf("\n建立矩阵T:\n");
			T=CreatTSMatrix();
			PrintTSMatrix(T);
			Q=MultRLSMatrix(M,T);
			printf("M*T得到矩阵Q,");
			PrintRLSMatrix(Q);	break;		
		}//switch(i)
	}//while(1)
}

void MenuMatrix()
//矩阵演示系统菜单
{
	printf("\n\n\n\n\n\n===============矩阵演示系统==================");
	printf("\n0.退出");
	printf("\n1.进入二维数组存储结构的矩阵演示系统");
	printf("\n2.进入三元组表存储的矩阵演示系统");
	printf("\n选择操作:");
}

void ShowMatrix()
//矩阵演示系统
{
	int i;
	while(1)
	{
		MenuMatrix();
		scanf("%d",&i);
		while(!(i>=0&&i<=2))
		{
			printf("非法输入:");
			MenuMatrix();
			scanf("%d",&i);
		}//while i
		switch(i)
		{
		case 0:	return;
		case 1:	ShowArMatrix();	break;
		case 2:	ShowTSMatrix();	break;
		}//switch
	}//while
}//ShowMatrix

void Menu()
{
	printf("\n\n\n\n\n\n======================线性表演示系统====================");
	printf("\n0.结束");
	printf("\n1.进入顺序表演示系统");
	printf("\n2.进入链表演示系统");
	printf("\n3.进入串的模式匹配演示系统");
	printf("\n4.进入矩阵演示系统");
	printf("\n请选择:");
}//Menu

void main()
{
	int i;
	while(1)
	{
		Menu();
		scanf("%d",&i);
		while(!((i>=0)&&(i<=7)))
		{
			printf("输入错误,选择操作:");
			scanf("%d",&i);
		}//while(i)	
		switch(i)
		{
		case 0:	return;
		case 1:	ShowSqList();	break;
		case 2: ShowLinkedList();	break;
		case 3:	ShowKMP();	break;
		case 4:	ShowMatrix();	break;
		}//switch(i)
	}//while(1)
}//main

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -