数据结构实验代码.docx
- 文档编号:9384620
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:27
- 大小:18.44KB
数据结构实验代码.docx
《数据结构实验代码.docx》由会员分享,可在线阅读,更多相关《数据结构实验代码.docx(27页珍藏版)》请在冰豆网上搜索。
数据结构实验代码
1、队列
#include
#include
#defineOVERFLOW-1
#defineOK1
#defineERROR0
#defineMAXSIZE100
typedefstruct
{
int*elem;//队列存储空间
intfront;
intrear;
}SqQueue;
//判断选择是否正确
intmenu_select()
{
intsn;
for(;;)
{
scanf("%d",&sn);
if(sn<1||sn>6)
printf("\n\t输入错误,请重新输入\n");
else
break;
}
returnsn;
}
//参数(传出)SqQueue&Q,循环队列(空)
intInitQueue(SqQueue&Q)
{
Q.elem=(int*)malloc(MAXSIZE*sizeof(int));
if(!
Q.elem)exit(OVERFLOW);
Q.front=Q.rear=-1;
for(inti=0;i Q.elem[i]=-1; returnOK; } //返回Q的元素个数 intQueueLength(SqQueueQ) { return(Q.rear-Q.front+MAXSIZE)%MAXSIZE; } //显示队列的元素 voidDisplay(SqQueueQ) { for(inti=0;i<=QueueLength(Q);i++) if(Q.elem[i]! =-1)printf("%d",Q.elem[i]); printf("\n"); } //入队 intEnQueue(SqQueue&Q,inte) { Q.rear=(Q.rear+1)%MAXSIZE; if(Q.rear==Q.front)returnERROR; Q.elem[Q.rear]=e; returnOK; } //出队 intDeQueue(SqQueue&Q,int&e) { if(Q.front==Q.rear)returnERROR; e=Q.elem[Q.front+1]; Q.elem[Q.front+1]=-1; Q.front=(Q.front+1)%MAXSIZE; returnOK; } voidmain() { SqQueueQ; InitQueue(Q); intelem,e; printf("请输入队列元素(以0结束): \n"); scanf("%d",&elem); while(elem! =0) { EnQueue(Q,elem); scanf("%d",&elem); } printf("队列为: \n"); Display(Q); printf("1.初始化一个队列;\n2.入队;\n3.出队;\n4.显示队列的所有元素;\n5.队列长度: \n6.结束;\n"); while (1) { switch(menu_select()) { case1: printf("请输入队列元素(以0结束): \n"); scanf("%d",&elem); while(elem! =0) {EnQueue(Q,elem); scanf("%d",&elem);} printf("队列为: \n"); Display(Q); fflush(stdin); break; case2: scanf("%d",&elem); EnQueue(Q,elem); printf("队列为: \n"); Display(Q); fflush(stdin); break; case3: DeQueue(Q,elem); printf("队列为: \n"); Display(Q); break; case4: printf("\n队列的所有元素: \n"); Display(Q); break; case5: printf("%d",QueueLength(Q)); break; case6: return; } } } 2矩阵(加,乘,转置) #include #defineM3 voidMatrixAdd(intm1[M][M],intm2[M][M],intresult[M][M])//两个矩阵m1和m2相加,结果放到result { inti,j; for(i=0;i { for(j=0;j result[i][j]=m1[i][j]+m2[i][j]; } } voidMatrixTrams(intm1[M][M],intresult[M][M])//矩阵转置 { inti,j; for(i=0;i { for(j=0;j result[i][j]=m1[j][i]; } } voidMatrixMultiply(intm1[M][M],intm2[M][M],intresult[M][M]) { inti,j; for(i=0;i { for(j=0;j { result[i][j]=0; for(intk=0;k result[i][j]+=m1[i][k]*m2[k][j]; } } } voidDisplay(intresult[M][M])//显示矩阵 { inti,j; for(i=0;i { for(j=0;j printf("%-5d",result[i][j]); printf("\n"); } } voidmain() { intA[M][M],B[M][M]; inti,j; printf("请输入第一个矩阵: \n"); for(i=0;i for(j=0;j scanf("%d",&A[i][j]); printf("请输入第二个矩阵: \n"); for(i=0;i for(j=0;j scanf("%d",&B[i][j]); intresult[M][M]; printf("\n矩阵A: \n"); Display(A); printf("\n矩阵B: \n"); Display(B); printf("\n请选择: \n1.矩阵相加: \n2.矩阵A转置: \n3.矩阵B转置: \n4.矩阵相乘: \n5.退出。 \n\n"); while (1) {intl; scanf("%d",&l); switch(l) { case1: printf("矩阵相加的运算结果: \n"); MatrixAdd(A,B,result); Display(result); printf("\n"); break; case2: printf("矩阵A转置的运算结果: \n"); MatrixTrams(A,result); Display(result); printf("\n"); break; case3: printf("矩阵B转置的运算结果: \n"); MatrixTrams(B,result); Display(result); printf("\n"); break; case4: printf("矩阵相乘的运算结果: \n"); MatrixMultiply(A,B,result); Display(result); printf("\n"); break; case5: printf("退出。 \n"); return; default: printf("输入错误! "); printf("\n"); } } } 3链表 #include #include #include structnode { inte; structnode*next; }; structnode*(InitList()) { structnode*head; head=(structnode*)malloc(sizeof(structnode)); head->e=0; head->next=NULL; returnhead; } voidDestroyList(structnode*p) { structnode*q; q=p; while(q->next! =NULL) { q=p->next; p->next=q->next; free(q); q=p; p->e--; } } structnode*(ClearList(structnode*p)) { structnode*q,*q1; q1=p; q=p->next; p=p->next; while(p! =NULL) { p=p->next; free(q); q=p; } returnq1; } intListEmpty(structnode*p) { if(p->e==0)return1; elsereturn0; } intListLength(structnode*p) { inti=0; p=p->next; while(p! =NULL) { p=p->next; i++; } return(i); } intGetElem(structnode*p,inti,inte) { intj=0; if(ListLength(p) p=p->next; while(j { p=p->next; j++; } e=p->e; returne; } voidListInsert(structnode*p,inti,inte) { intj=0; structnode*q,*head; q=p; head=p; if(i<1||i>ListLength(p)+1)printf("error\n"); else { p=p->next; while(j { q=p; p=p->next; j++; } q->next=(structnode*)malloc(sizeof(structnode)); q=q->next; q->e=e; q->next=p; } head->e=head->e+1; } voidListDelete(structnode*p,inti) { structnode*head=p; if(i<0||i>ListLength(p))printf("error\n"); else { intj=0; structnode*q=p; p=p->next; while(j { q=p; p=p->next; j++; } q->next=p->next; free(p); } head->e--; } voidDisplay(structnode*p) { printf("总数为%d\n",p->e); p=p->next; while(p! =NULL) { printf("%d",p->e); p=p->next; } printf("\n"); } voidtianjia(structnode*p,intx) { structnode*head=p; while(p->next! =NULL) { p=p->next; } p->next=(structnode*)malloc(sizeof(structnode)); p=p->next; p->e=x; p->next=NULL; head->e++; } voidmain() { structnode*head; head=InitList(); intn,x,y; printf("1.查看链表\n"); printf("2.清空链表\n"); printf("3.插入元素\n"); printf("4.删除元素\n"); printf("5.产生一个长度为10的链表\n"); printf("6.退出\n"); scanf("%d",&n); if(n<1||n>6) { printf("输入错误,请从新输入\n"); n=0; } while(n! =6) { if(n==1) { Display(head); n=0; } if(n==2) { DestroyList(head); n=0; } if(n==3) { printf("请输入要插入的位置和数: \n"); scanf("%d%d",&x,&y); ListInsert(head,x,y); n=0; } if(n==4) { printf("请输入要删除第几个数\n"); scanf("%d",&n); ListDelete(head,n); n=0; } if(n==5) { for(inti=1;i<=10;i++) { inte=rand(); tianjia(head,e); } Display(head); intn=0; } printf("1.查看链表\n"); printf("2.清空链表\n"); printf("3.插入元素\n"); printf("4.删除元素\n"); printf("5.产生一个长度为10的链表\n"); printf("6.退出\n"); scanf("%d",&n); } } 4、两个指针指向左右孩子各种遍历方式 //描述: 两个指针指向左右孩子,算法见教材 #include #include #defineMAX50 typedefstructbtnode { intData; structbtnode*Llink; structbtnode*Rlink; }btnode,*btreetype; btreetypeCreatTree(intn)//传入数据数量,返回根结点指针 { inti; btreetyperoot=NULL; for(i=0;i { btreetypenewNode,currentNode,parentNode; newNode=(btreetype)malloc(sizeof(btnode)); scanf("%d",&newNode->Data); newNode->Llink=NULL; newNode->Rlink=NULL; currentNode=root; if(currentNode==NULL)root=newNode; else{ while(currentNode! =NULL) { parentNode=currentNode; if(newNode->Data currentNode=currentNode->Llink; else currentNode=currentNode->Rlink; } if(newNode->Data parentNode->Llink=newNode; else parentNode->Rlink=newNode; } } returnroot; } voidOutputTree(btreetype&root) { btreetypep; p=root->Llink; printf("建立的二叉树的左子树为: \n"); while(p! =NULL) { printf("%-8d",p->Data); p=p->Llink; } p=root->Rlink; printf("\n建立的二叉树的右子树为: \n"); while(p! =NULL) { printf("%-8d",p->Data); p=p->Rlink; } } intdepth(btreetyperoot) { btreetypep; p=root; intdep1; intdep2; if(root==NULL)return0; else { dep1=depth(p->Llink); dep2=depth(p->Rlink); if(dep1>dep2)return(dep1+1); elsereturn(dep2+1); } } voidPreOrder(btreetype&root)//先序遍历(递归) { btreetypep; p=root; if(p! =NULL) { printf("%-5d",p->Data); PreOrder(p->Llink); PreOrder(p->Rlink); } } voidInOrder(btreetype&root)//中序遍历(递归) { btreetypep; p=root; if(p! =NULL) { InOrder(p->Llink); printf("%-5d",p->Data); InOrder(p->Rlink); } } voidInOrder_Norecuision(btreetype&root) { btreetypestack[MAX]; btreetypep; inttop=0; p=root; do { while(p! =NULL) { top++; stack[top]=p; p=p->Llink; } if(top>0) { p=stack[top]; top--; printf("%-5d",p->Data); p=p->Rlink; } }while(p! =NULL||top! =0); } voidPostOrder(btreetype&root) { btreetypep; p=root; if(p! =NULL) { PostOrder(p->Llink); PostOrder(p->Rlink); printf("%-5d",p->Data); } } voidmain() { btreetypebtree; intcount; printf("请输入元素个数: \n"); scanf("%d",&count); printf("请输入数据: \n"); btree=CreatTree(count); OutputTree(btree); printf("\n建立的二叉树的深度为: %d\n",depth(btree)); printf("\n先序遍历: \n"); PreOrder(btree); printf("\n中序遍历(递归算法): \n"); InOrder(btree); printf("\n中序遍历(非递归算法): \n"); InOrder_Norecuision(btree); printf("\n后序遍历: \n"); PostOrder(btree); printf("\n"); } 5、栈 #include #include #defineStack_Size6 #defineERROR0 #defineOK1 typedefintSElemType; typedefstructSNode { SElemTypedata; structSNode*next; }SNode,*LinkStack; intCreatTwo(LinkStack&head,intn) { inti; SNode*p; head=(LinkStack)malloc(sizeof(SNode)); head->next=NULL; printf("请输入数据(数字): \n"); for(i=n;i>0;--i) { p=(SNode*)malloc(sizeof(SNode)); scanf("%d",&p->data); p->next=head->next; head->next=p; } return1; } intmenu_select() { intsn; for(;;) { scanf("%d",&sn); if(sn<1||sn>6) printf("\n\t输入错误,请重新输入\n"); else break; } returnsn; } intPush(LinkStack&top,SElemTypee) { SNode*q; q=(LinkStack)malloc(sizeof(SNode));
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 代码
![提示](https://static.bdocx.com/images/bang_tan.gif)