数据结构与算法实验源代码.docx
- 文档编号:6784533
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:38
- 大小:113.84KB
数据结构与算法实验源代码.docx
《数据结构与算法实验源代码.docx》由会员分享,可在线阅读,更多相关《数据结构与算法实验源代码.docx(38页珍藏版)》请在冰豆网上搜索。
数据结构与算法实验源代码
实验二
#include
#include
#defineMaxlen100
typedefstruct{
intdata[Maxlen];
intlast;
}Sequenlist;
Sequenlist*SqLsetnull(){//建立一个空的顺序表
Sequenlist*L;
L=(Sequenlist*)malloc(sizeof(Sequenlist));
L->last=-1;
returnL;
}
void*SqLset(Sequenlist*L){//对顺序表输入数据
intn;
printf("请输入要输入的元素数量:
");
scanf("%d",&n);
printf("请输入要输入的元素:
");
for(inti=0;i scanf("%d",&L->data[i]); } L->last=i; returnL; } intSqLdelete(Sequenlist*L,inti){//删除顺序表中的元素 //因为只是调用该函数删除顺序表中多余的元素省略的一些数据判断 intj; for(j=i;j<=L->last+1;j++) L->data[j]=L->data[j+1]; L->last--; return1; } voidSqLdel(Sequenlist*L){//寻找顺序表中多余的元素并删除 inti,j; if(L->last<0){ printf("\n顺序表为空\n"); } else{ for(i=0;i<=L->last;i++){ for(j=i+1;j<=L->last;j++) if(L->data[j]==L->data[i]){ SqLdelete(L,j);//调用函数删除下标为j的结点 } } } } voidSqLsc(Sequenlist*L){//输出顺序表中的数据 inti; if(L->last<0) printf("\n顺序表为空\n"); else{ printf("顺序表中的元素: "); for(i=0;i printf("%d",L->data[i]); } } printf("\n"); } intmain(void){ Sequenlist*L; L=SqLsetnull(); intchoice; printf("1,输入数据2,删除重复多余的数据3,输出数据0,退出\n"); do{ printf("请输入选择: "); scanf("%d",&choice); switch(choice){ case1: SqLset(L); printf("\n"); break; case2: SqLdel(L); printf("\n"); break; case3: SqLsc(L); printf("\n"); break; default: printf("请输入正确的选择! \n"); break; case0: break; } }while(choice! =0); return0; } 实验三 #include #include #defineSIZE15 typedefstruct{ intdata[SIZE]; intlast; }RecordList; RecordList*shuru(){//向顺序表中输入数据 ints,i=0; RecordList*L; L=(RecordList*)malloc(sizeof(RecordList)); printf("请输入要输入到顺序表中数据的数量: "); scanf("%d",&s); if(s>15){ printf("超过最大的数据长度"); } else{ printf("请输入要输入的数据: "); for(i=0;i scanf("%d",&L->data[i]); } printf("成功输入%d个数据\n\n",i); L->last=i-1; returnL; } voidpaixu(RecordList*L){//冒泡排序法对顺序表中的数据进行排序 intx,change=1,i,j; for(i=0;i =0;i++){ change=0; for(j=0;j if(L->data[j]>L->data[j+1]){ x=L->data[j+1]; L->data[j+1]=L->data[j]; L->data[j]=x; change=1; } } } } intBinSrch(RecordList*L,intk){//二分查找 intlow=0,i=-1,high,mid; high=L->last; while(low<=high){ mid=(low+high)/2; if(k==L->data[mid]){ i=mid; break; } elseif(k high=mid-1; else low=mid+1; } returni; } intmain(void) { RecordList*L=NULL; inti,choice,data1; printf("1,输入数据2,二分法查找0,退出\n"); do{ printf("请输入选择: "); scanf("%d",&choice); switch(choice){ case1: L=shuru();//输入数据 paixu(L);//数据排序 break; case2: if(L==NULL||L->last==-1){//查找前检验表中是否有数据 printf("\n顺序表为空\n\n"); break; } else{ printf("请输入要查找的数据: "); scanf("%d",&data1); i=BinSrch(L,data1); printf("数据%d的序号(下标)是%d\n\n",data1,i); break; } default: printf("\n请输入正确的选择\n\n"); break; case0: break; } }while(choice! =0); return0; } 实验四 #include #include #defineSIZE15 typedefstruct{ intdata[SIZE]; intlast; }RecordList; RecordList*shuru(){//向顺序表中输入数据 ints,i=0; RecordList*L; L=(RecordList*)malloc(sizeof(RecordList)); printf("请输入要输入到顺序表中数据的数量: "); scanf("%d",&s); if(s>15){ printf("超过最大的数据长度"); } else{ printf("请输入要输入的数据: "); for(i=0;i scanf("%d",&L->data[i]); } printf("成功输入%d个数据\n\n",i); L->last=i-1; returnL; } voidpaixu(RecordList*L){//冒泡排序法对顺序表中的数据进行排序 intx,change1=1,change2=1,i,j; for(i=0;change1! =0||change2! =0;i++){ change1=0; change2=0; if(i%2==0){ for(j=1;j if(L->data[j]>L->data[j+1]){ x=L->data[j+1]; L->data[j+1]=L->data[j]; L->data[j]=x; change1=1; } } } else{ for(j=0;j if(L->data[j]>L->data[j+1]){ x=L->data[j+1]; L->data[j+1]=L->data[j]; L->data[j]=x; change2=1; } } } } } voidshuchu(RecordList*L){ inti; for(i=0;i<=L->last;i++){ printf("%d",L->data[i]); } } intmain(void) { RecordList*L=NULL; intchoice; printf("1,输入数据2,冒泡排序3,输出0,退出\n"); do{ printf("请输入选择: "); scanf("%d",&choice); switch(choice){ case1: L=shuru();//输入数据 break; case2: paixu(L);//数据排序 printf("排序成功\n\n"); break; case3: shuchu(L); printf("\n"); break; default: printf("\n请输入正确的选择\n\n"); break; case0: break; } }while(choice! =0); return0; } 实验五 #include #include typedefstructnode{ intdata; structnode*next; }LinkList; LinkList*CreatList(){ LinkList*head,*r,*s;//建立带头结点的链表,head为链表的头结点 intn; head=(LinkList*)malloc(sizeof(LinkList)); head->next=NULL; r=head; printf("请输入要输入的数据的个数: "); scanf("%d",&n); printf("请输入要输入的数据: "); for(inti=0;i s=(LinkList*)malloc(sizeof(LinkList)); scanf("%d",&s->data); s->next=NULL; r->next=s; r=s;//r指向链表的尾节点 } returnhead; } voidAdd(LinkList*head,intx){ LinkList*s,*r,*t; t=(LinkList*)malloc(sizeof(LinkList)); r=head; s=head->next; for(;s! =NULL&&x>=s->data;s=s->next){//要寻找要插入节点的位置 r=r->next; } t->data=x; if(s==NULL){//插入在链表的表尾 r->next=t; t->next=NULL; } else{//插入在链表的中间 t->next=r->next; r->next=t; } } voidOut(LinkList*head){//输出表中的数据 LinkList*L; L=head->next; printf("表中的数据: "); for(;L;L=L->next){ printf("%d",L->data); } printf("\n"); } intmain(void){ LinkList*head; intx; head=CreatList(); Out(head); printf("请输入要插入的数据: "); scanf("%d",&x); Add(head,x); Out(head); return0; } 实验七 #include #include typedefstructnode{ intdata; structnode*next; }LinkList; typedefstruct{ LinkList*rear; }LinkQueue; LinkQueue*SetQueue(){//建立空的队列 LinkQueue*Q; LinkList*head; Q=(LinkQueue*)malloc(sizeof(LinkQueue)); head=(LinkList*)malloc(sizeof(LinkQueue)); head->data=-1; head->next=head; Q->rear=head; returnQ; } intQueueEmpty(LinkQueue*Q){//检验对列是否为空 LinkList*p; p=Q->rear; if(p->data==-1){ return1; } else return0; } LinkQueue*Add(LinkQueue*Q,intx){//数据入队 LinkList*p; p=(LinkList*)malloc(sizeof(LinkList)); p->data=x; p->next=Q->rear->next; Q->rear->next=p; Q->rear=p; returnQ; } voidOut(LinkQueue*Q){//数据出队 LinkList*p1,*p2; p1=Q->rear; p2=Q->rear; p2=p2->next; p1=p2->next; if(p1->data==-1){ printf("队列为空"); return; } printf("出队的数据是%d\n",p1->data); p2->next=p1->next; } LinkQueue*SetNull(LinkQueue*Q){//队列置空 Q->rear=Q->rear->next; Q->rear->next=Q->rear; returnQ; } intmain(void){ LinkQueue*Q=NULL; intchoice,x,i; printf("1,建立空队列2,数据入队3,数据出队4,置队空5,检验队空0,退出\n"); do{ printf("\n请输入选择: "); scanf("%d",&choice); switch(choice){ case1: Q=SetQueue(); printf("已建立空队列\n"); break; case2: printf("请输入要入队的数据: "); scanf("%d",&x); Q=Add(Q,x); break; case3: Out(Q); break; case4: Q=SetNull(Q); printf("队列已置空"); break; case5: i=QueueEmpty(Q); if(i==1) printf("队列为空\n"); else printf("队列未空\n"); break; case0: break; } }while(choice! =0); return0; } 实验八 #include #defineSIZE100 voidzhuanzhi(intsa[],intn){//转置函数 intm,t; for(inti=0;i<3*n-2;i++){ if(i%3! =0){ m=i+1; t=sa[i]; sa[i]=sa[m];//交换对称的两个数据 sa[m]=t; i++;//跳过矩阵的下三角数据 }//矩阵对角线上的数据不进行操作 } } voidJPrintf(intsa[],intn){//输出函数 inti,j; for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ if(i==j-1||i==j||i==j+1){//i==j-1对角线下方的元素i==j对角线上的元素i==j+1对角线上方的元素 printf("%d",sa[2*i+j-3]);//非零元素在数据中的下标为2*i+j-3 } else printf("0"); } printf("\n"); } } intmain(void){ intn,sa[SIZE]; printf("请输入三对角矩阵的阶数: "); scanf("%d",&n); printf("请依次输入三对角矩阵中的非零数据: "); for(inti=0;i<3*n-2;i++){//三对角矩阵共有3*n-2g个非零元素 scanf("%d",&sa[i]); } JPrintf(sa,n); zhuanzhi(sa,n); printf("转置后的矩阵: \n"); JPrintf(sa,n); return0; } 实验九 #include #include #definemaxsize10 typedefstructnode{ chardata; structnode*lchild,*rchild; }Bitree; Bitree*Q[maxsize];//使用队列临时记录节点地址 Bitree*Creatree(){//建立一个二叉树 charch; intfront,rear; Bitree*T,*s; T=NULL; front=1; rear=0; printf("请输入一个二叉树(以#号结束): "); ch=getchar(); while(ch! ='#'){//以输入“#”结束输入 s=NULL; if(ch! ='@'){//输入“@”表示虚节点 s=(Bitree*)malloc(sizeof(Bitree));//如果不是虚节点就建立新节点 s->data=ch; s->lchild=s->rchild=NULL; } rear++; Q[rear]=s; if(rear==1)//输入的第一个节点为根节点 T=s; else{ if(s! =NULL&&Q[front]! =NULL) if(rear%2==0)//若rear为偶数则该节点为父节点的左孩子,否则为右孩子 Q[front]->lchild=s; else Q[front]->rchild=s; if(rear%2==1) front++; } ch=getchar(); } returnT; } voidvisite(Bitree*T,int*m){ if(T->lchild==NULL&&T->rchild==NULL){//没有左孩子也没有右孩子就是叶子节点 (*m)++; } } voidPreorder(Bitree*T,int*m){//使用递归遍历二叉树 if(T){ visite(T,m);//访问根节点 Preorder(T->lchild,m); Preorder(T->rchild,m); } } intmain(void){ int*m,n=0; m=&n;//使用一个指针用于记录叶子节点的个数 Bitree*T; T=Creatree(); Preorder(T,m); printf("该二叉树的叶子节点数: %d\n",n); return0; } 实验十 #include #include #definemaxsize10 typedefstructnode{ chardata; structnode*lchild,*rchild; }Bitree; Bitree*Q[maxsize];//使用队列临时记录节点地址 Bitree*Creatree(){//建立一个二叉树 charch; intfront,rear; Bitree*T,*s; T=NULL; front=1; rear=0; printf("请输入一个二叉树(以#号结束): "); ch=getchar(); while(ch! ='#'){//以输入“#”结束输入 s=NULL; if(ch! ='@'){//输入“@”表示虚节点 s=(Bitree*)malloc(sizeof(Bitree));//如果不是虚节点就建立新节点
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 实验 源代码
![提示](https://static.bdocx.com/images/bang_tan.gif)