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

📄 第一题.cpp

📁 另外一个可以实现线性表的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		}
		else
			j=next[j];
	}
	return next;
}//GetNext

int * GetNextval(SqList T){//求模式串的next函数的修正值并存入数组nextval
	int i=0,j=-1,*nextval;
	nextval=(int *)malloc((T.length)*sizeof(int));
	nextval[0]=-1;
	while(i<T.length-1)
	{
		if(j==-1||T.elem[i]==T.elem[j])
		{
			i++;
			j++;
			if(T.elem[i]!=T.elem[j])
				nextval[i]=j;
			else
				nextval[i]=nextval[j];
		}
		else
			j=nextval[j];
	}
	return nextval;
}//GetNextval

int IndexKMP(SqList S,SqList T,int pos){//KPM算法
	int i=pos,j=1,*next;		
	next=GetNextval(T);
	while(i<=S.length&&j<=T.length)
	{
		if(j==0||S.elem[i-1]==T.elem[j-1])
		{
			i++;
			j++;
		}
		else
			j=next[j-1]+1;		
	}
	if(j>T.length)
		return i-T.length-1;		
	else
		return 0;
}//IndexKMP

Matrix CreatMatrix(){//建立二维数组存储结构的矩阵M
	Matrix M;
	int i,j,mu,nu;
	printf("\n输入行数和列数(中间用逗号隔开):");
	scanf("%d,%d",&mu,&nu);
	M.mu=mu;
	M.nu=nu;	
	for(i=0;i<mu;i++)
	{
		for(j=0;j<nu;j++)
		{
			printf("输入元素M[%d][%d]=:",i,j);
			scanf("%d",&M.data[i][j]);
		}
	}
	return M;
}//CreatMatrix

Matrix TransMatrix(Matrix M){//求二维数组存储结构的矩阵M的转置矩阵
	Matrix N;
	int i,j;
	N.mu=M.nu;
	N.nu=M.mu;
	for(i=0;i<M.mu;i++)
	{
		for(j=0;j<M.nu;j++)
			N.data[j][i]=M.data[i][j];
	}
	return N;
}//TransMatrix

Matrix MultSMatrix(Matrix M,Matrix N){//求二维数组存储结构的矩阵M和N的乘积矩阵
	Matrix Q;
	int i,j,k;
	if(M.nu!=N.mu)
	{
		printf("这两个矩阵不能相乘!");
		exit(0);							
	}
	Q.mu=M.mu;
	Q.nu=N.nu;
	for(i=0;i<M.mu;i++)
		for(j=0;j<N.nu;j++)
		{
			Q.data[i][j]=0;
			for(k=0;k<M.nu;k++)
				Q.data[i][j]+=M.data[i][k]*N.data[k][j];
		}
	return Q;
}//MultSMatrix

void PrintMatrix(Matrix M)//输出矩阵
{
	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

void ShowSqList(){//顺序表演示系统		
	SqList L,La,Lb,Lc;
	int i,loc;
	while(1)
	{
		printf("\n\n\n\n                  顺序表演示系统                     \n");
	    printf("                  1.初始化顺序表并给顺序表赋值.              \n");
        printf("                  2.在顺序表L中位置i前插入新的元素.          \n");
	    printf("                  3.删除顺序表中的第i个元素.                 \n");
	    printf("                  4.合并顺序表.                              \n");
	    printf("                  5.结束.                                    \n");
	    printf("*************************************************************\n");
	    printf("                  请输入你要进行操作的序号:                  \n");
		scanf("%d",&i);
		while(!((i>0)&&(i<=5)))
		{
			printf("输入有误,请重新选择操作:");
			scanf("%d",&i);
			getchar();
		}
		switch(i)
		{
		
		    case 1:	L=InitSqList();
			        PrintSqList(L);	break;
	        case 2:	printf("输入位置pos:(0=<pos<=%d)",L.length+1);
			        scanf("%d",&loc);
			        getchar();
			        ListInsert_Sq(&L,loc);
			        PrintSqList(L);	break;
		    case 3:	ListDelete_Sq(&L);
			        PrintSqList(L);	break;
		    case 4:	printf("建立顺序表La,Lb:\n");
			        La=InitSqList();	
			        PrintSqList(La);
			        printf("\n");
			        Lb=InitSqList();	
			        PrintSqList(Lb);
			        Lc=MergeList_Sq(La,Lb);
			        PrintSqList(Lc);	break;
            case 5:	return;
		}
	}
}//ShowSqList

void ShowLinkedList(){//链表演示系统
    int i,locate,x;
	LinkedList head,La,Lb,p,Lc;
	while(1)
	{
		printf("\n\n\n\n               链表演示系统                         \n");
		printf("                  1.建立链表.                               \n");
		printf("                  2.遍历链表.                               \n");
		printf("                  3.检查链表是否为空.                       \n");
		printf("                  4.求链表的长度.                           \n");
		printf("                  5.从链表中查找所需位置的元素.             \n");
		printf("                  6.从链表表中查找与给定元素值相同          \n");
		printf("                    的元素在链表中的位置                    \n");
		printf("                  7.在链表中插入元素.                       \n");
		printf("                  8.删除链表中的元素.                       \n");
		printf("                  9.合并链表.                               \n");
		printf("                  10.结束.                                  \n");
		printf("************************************************************\n");
		printf("                  请输入你要进行操作的序号:                 \n");
		scanf("%d",&i);
		while(!((i>0)&&(i<=10)))
		{
			printf("\ni值错误");
			printf("\n请重新选择你要进行操作的序号(1<=i<=10):");
			scanf("%d",&i);
		}
		switch(i)
		{
			
			case 1:	head=LinkedListCreat();
					LinkedListTraverse(head);	break;
			case 2:	LinkedListTraverse(head);	break;
			case 3:	if(LinkedListEmpty(head))
						printf("链表为空");
					else
						printf("链表非空");	break;
			case 4: printf("链表的长度为%d",LinkedListLength(head));	break;
			case 5:	printf("请输入所要查找的位置:");
					scanf("%d",&locate);
					getchar();
					p=LinkedListGet(head,locate);
					if(!p)
						printf("输入非法");
					else
						printf("您要查找的元素是%d",p->data);	break;
			case 6:	printf("输入元素:");
					scanf("%d",&x);
					getchar();
					if(!LinkedListLocate(head,x))
						printf("不存在查找元素");
					else
						printf("元素的位置是%d",LinkedListLocate(head,x));	break;
			case 7:	printf("输入位置pos(1<=pos<=%d):",head->data);
					scanf("%d",&locate);
					getchar();
					printf("输入元素:");
					scanf("%d",&x);
					LinkedListInsert(head,locate,x);
					LinkedListTraverse(head);	break;
			case 8: printf("输入要删除的元素:");
					scanf("%d",&x);
					getchar();
					LinkedListDel(head,x);
					LinkedListTraverse(head);	break;
			case 9:printf("建立链表La:");
					La=LinkedListCreat();
					LinkedListTraverse(La);
					printf("\n建立链表Lb:");
					Lb=LinkedListCreat();
					LinkedListTraverse(Lb);
					Lc=MergeLinkedList(La,Lb);
					printf("\n合并链表La、Lb,并排序后得到");
					LinkedListTraverse(Lc);
            case 10:	return;
		}
	}
}//ShowLinkedList

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

void ShowArMatrix(){//二维数组存储结构的矩阵演示系统
	int i;
	Matrix M,N,T,Q;
	while(1)
	{   printf("\n\n\n\n\n               二维数组存储结构的矩阵演示系统          \n");
	    printf("                  1.建立二维数组存储结构的矩阵.                  \n");
	    printf("                  2.求二维数组的矩阵的转置矩阵.                  \n");
	    printf("                  3.求两个二维数组的矩阵的乘积矩阵.              \n");
	    printf("                  4.退出.                                        \n");
	    printf("*****************************************************************\n");
	    printf("                  请输入你要进行操作的序号:                      \n");
		scanf("%d",&i);
		while(!((i>=0)&&(i<=4)))
		{
			printf("输入不正确,请重新选择操作:");
			scanf("%d",&i);
		}	
		switch(i)
		{
		
		case 1:	M=CreatMatrix();
			    PrintMatrix(M);	break;
		case 2: N=TransMatrix(M);
			    PrintMatrix(N);	break;
		case 3:	printf("建立要相乘的矩阵M和T:\n");
                printf("先建立矩阵M:");
			    M=CreatMatrix();				
			    PrintMatrix(M);
				printf("建立矩阵T:");
			    T=CreatMatrix();
			    PrintMatrix(T);
			    Q=MultSMatrix(M,T);
			    printf("两矩阵相乘得到矩阵Q ");
			    PrintMatrix(Q);	break;
		case 4:	return;
		}
	}
}//ShowArMatrix

void main(){
	int i;
	while(1)
	{
        printf("\n\n\n\n\n                  数据结构演示系统                      \n");
	    printf("                  1.顺序表演示系统.                               \n");
	    printf("                  2.链表演示系统.                                 \n");
	    printf("                  3.串的模式匹配演示系统.                         \n");
	    printf("                  4.矩阵演示系统.                                 \n");
	    printf("                  5.退出.                                         \n");
		printf("******************************************************************\n");
		printf("                  请输入你要进入的演示系统:                       \n");
		scanf("%ld",&i);
		while(i<1||i>5)
		{     printf("输入不正确,请重新输入你要进入的演示系统(0<i<5):");
		      scanf("%ld",&i);
		}
		switch(i)
		{     case 1:ShowSqList(); break;
		      case 2:ShowLinkedList(); break;
			  case 3:ShowKMP(); break;
			  case 4:ShowArMatrix(); break;
			  case 5: return;
		}
	}
}//main
	


		
	


⌨️ 快捷键说明

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