数据结构实验三
来源:互联网 发布:matlab 声明一个数组 编辑:程序博客网 时间:2024/06/07 14:38
实验目录
1、编写函数void delx(linklist head, datatype x),删除带头结点单链表head中第一个值为x 的结点。
并构造测试用例进行测试。
并构造测试用例进行测试。
2、假设线性表(a1,a2,a3,…an)采用带头结点的单链表存储,请设计算法函数linklist reverse(linklist head),
将带头结点的单链表head就地倒置,使表变成(an,an-1,…a3.a2,a1)。并构造测试用例进行测试。
将带头结点的单链表head就地倒置,使表变成(an,an-1,…a3.a2,a1)。并构造测试用例进行测试。
3、假设带头结点的单链表head是升序排列的,设计算法函数linklist insert(linklist head,datatype x),
将值为x的结点插入到链表head中,并保持链表有序性。
分别构造插入到表头、表中和表尾三种情况的测试用例进行测试。
将值为x的结点插入到链表head中,并保持链表有序性。
分别构造插入到表头、表中和表尾三种情况的测试用例进行测试。
4、编写算法函数linklist delallx(linklist head, int x),删除带头结点单链表head中所有值为x的结点。
5、已知线性表存储在带头结点的单链表head中,请设计算法函数void sort(linklist head),将head中的结点按结点值升序排列。
6、已知两个带头结点的单链表L1和L2中的结点值均已按升序排序,设计算法函数
linklist mergeAscend (linklist L1,linklist L2)将L1和L2合并成一个升序的
带头结单链表作为函数的返回结果;
设计算法函数linklist mergeDescend (linklist L1,linklist L2)
将L1和L2合并成一个降序的带头结单链表作为函数的返回结果;
并设计main()函数进行测试。
linklist mergeAscend (linklist L1,linklist L2)将L1和L2合并成一个升序的
带头结单链表作为函数的返回结果;
设计算法函数linklist mergeDescend (linklist L1,linklist L2)
将L1和L2合并成一个降序的带头结单链表作为函数的返回结果;
并设计main()函数进行测试。
7、设计一个算法linklist interSection(linklist L1,linklist L2),
求两个单链表表示的集合L1和L2的交集,并将结果用一个新的带头
结点的单链表保存并返回表头地址。
求两个单链表表示的集合L1和L2的交集,并将结果用一个新的带头
结点的单链表保存并返回表头地址。
8、请编写一个算法函数void partion(linklist head),
将带头结点的单链表head中的所有值为奇数的结点调整
到链表的前面,所有值为偶数的结点调整到链表的后面。
将带头结点的单链表head中的所有值为奇数的结点调整
到链表的前面,所有值为偶数的结点调整到链表的后面。
9、编写一个程序,用尽可能快的方法返回带头结点单链表中倒数第k个结点的地址,如果不存在,则返回NULL。
实验一
/*编写函数void delx(linklist head, datatype x),删除带头结点单链表head中第一个值为x 的结点。并构造测试用例进行测试。*//**********************************//*文件名称:lab3_01.c *//**********************************///#include "slnklist.h"/*请将本函数补充完整,并进行测试*/linklist delx(linklist head,datatype x){ linklist pre=head,p=head->next,q; while(p) { if(p->info==x) { pre->next=p->next; free(p); break; } pre=p; p=p->next; } return head;}int main(){ datatype x; linklist head; head=creatbyqueue();/*尾插入法建立带头结点的单链表*/ print(head); printf("请输入要删除的值:"); scanf("%d",&x); head=delx(head,x);/*删除单链表的第一个值为x的结点*/ print(head); delList(head);/*释放单链表空间*/ return 0;}
实验二
/**********************************//*文件名称:lab3_02.c *//**********************************//*假设线性表(a1,a2,a3,…an)采用带头结点的单链表存储,请设计算法函数linklist reverse(linklist head),将带头结点的单链表head就地倒置,使表变成(an,an-1,…a3.a2,a1)。并构造测试用例进行测试。*///#include "slnklist.h"/*请将本函数补充完整,并进行测试*/linklist reverse(linklist head){ int flag=1; linklist p,q,temp; if(head->next) p=head->next; if(p->next) q=p->next; while(q) { temp=q->next; q->next=p; if(flag) {p->next=NULL;flag=0;} p=q; q=temp; } head->next=p; return head;}int main(){ datatype x; linklist head; head=creatbystack();/*头插入法建立带头结点的单链表*/ print(head);/*输出原链表*/ head= reverse(head);/*倒置单链表*/ print(head);/*输出倒置后的链表*/ delList(head); return 0;}
实验三
/*假设带头结点的单链表head是升序排列的,设计算法函数linklist insert(linklist head,datatype x),将值为x的结点插入到链表head中,并保持链表有序性。分别构造插入到表头、表中和表尾三种情况的测试用例进行测试。*//**********************************//*文件名称:lab3_03.c *//**********************************///#include "slnklist.h"/*请将本函数补充完整,并进行测试*/linklist insert(linklist head,datatype x){ linklist p,q=NULL,pre=NULL,h; h=(node*)malloc(sizeof(node)); h->info=x; p=head; if(head->next) q=head->next; while(q&&q->info<x) { pre=q; q=q->next; } if(!pre) { head->next=h; h->next=q; } else if(q) { pre->next=h; h->next=q; } else { pre->next=h; h->next=NULL; } return head;}int main(){ datatype x; linklist head; printf("输入一组升序排列的整数:\n"); head=creatbyqueue();/*尾插入法建立带头结点的单链表*/ print(head); printf("请输入要插入的值:"); scanf("%d",&x); head=insert(head,x);/*将输入的值插入到带头结点的单链表适当位置*/ print(head); delList(head); return 0;}
实验四
/*编写算法函数linklist delallx(linklist head, int x),删除带头结点单链表head中所有值为x的结点。*//**********************************//*文件名称:lab3_04.c *//**********************************///#include "slnklist.h"/*请将本函数补充完整,并进行测试*/linklist delallx(linklist head,int x){ linklist p,q,pre,temp; pre=head; p=head->next; while(p) { if(p->info==x) { temp=p->next; pre->next=temp; free(p); p=temp; } else { pre=p; p=p->next; } } return head;}int main(){ datatype x; linklist head; head=creatbyqueue();/*尾插入法建立带头结点的单链表*/ print(head); printf("请输入要删除的值:"); scanf("%d",&x); head=delallx(head,x); print(head); delList(head); return 0;}
实验五
/*已知线性表存储在带头结点的单链表head中,请设计算法函数void sort(linklist head),将head中的结点按结点值升序排列。*//**********************************//*文件名称:lab3_05.c *//**********************************///#include "slnklist.h"/*请将本函数补充完整,并进行测试*/linklist sort(linklist head){ linklist p,q,pre; p=q=head->next; for(;q;q=q->next) { for(p=q;p;p=p->next) { if(p->info<q->info) { int temp=p->info; p->info=q->info; q->info=temp; } } } return head;}int main(){ linklist head; head=creatbyqueue(); /*尾插法建立带头结点的单链表*/ print(head); /*输出单链表head*/ sort(head); /*排序*/ print(head); delList(head); return 0;}
实验六
/*已知两个带头结点的单链表L1和L2中的结点值均已按升序排序,设计算法函数linklist mergeAscend (linklist L1,linklist L2)将L1和L2合并成一个升序的带头结单链表作为函数的返回结果;设计算法函数linklist mergeDescend (linklist L1,linklist L2)将L1和L2合并成一个降序的带头结单链表作为函数的返回结果;并设计main()函数进行测试。*//**********************************//*文件名称:lab3_06.c *//**********************************///#include "slnklist.h"/*请将本函数补充完整,并进行测试*/linklist mergeAscend(linklist L1,linklist L2){ linklist p1,p2,pre,q1,head; p1=L1->next; p2=L2->next; head=(linklist)malloc(sizeof(node)); head->next=NULL; pre=head; while(p1&&p2) { if(p1->info<=p2->info) { pre->next=p1; pre=p1; p1=p1->next; } else { pre->next=p2; pre=p2; p2=p2->next; } } pre->next=p1?p1:p2; return head;}linklist mergeDescend(linklist L1,linklist L2){}int main(){ linklist h1,h2,h3; h1=creatbyqueue(); /*尾插法建立单链表,请输入升序序列*/ h2=creatbyqueue(); print(h1); print(h2); h3=mergeAscend(h1,h2);/*升序合并到h3*/ /*降序合并请调用h3=mergeDescend(h1,h2); */ print(h3); delList(h3); return 0;}
实验七
/*设计一个算法linklist interSection(linklist L1,linklist L2),求两个单链表表示的集合L1和L2的交集,并将结果用一个新的带头结点的单链表保存并返回表头地址。*//**********************************//*文件名称:lab3_07.c *//**********************************///#include "slnklist.h"/*请将本函数补充完整,并进行测试*/linklist interSection(linklist L1, linklist L2){ linklist head,p,q,s,pre; head=(linklist)malloc(sizeof(node)); head->next=NULL; pre=head; for(p=L1->next;p;p=p->next) { for(q=L2->next;q;q=q->next) { if(q->info==p->info) { s=(linklist)malloc(sizeof(node)); s->info=p->info; pre->next=s; pre=s; break; } } } pre->next=NULL; return head;}int main(){ linklist h1,h2,h3; h1=creatbyqueue(); /*尾插法建立单链表,输入时请勿输入重复数据*/ h2=creatbyqueue(); print(h1); /*输出单链表h1*/ print(h2); h3=interSection(h1,h2); /* 求h1和h2的交集*/ print(h3); delList(h1); delList(h2); delList(h3); return 0;}
实验八
/*请编写一个算法函数void partion(linklist head),将带头结点的单链表head中的所有值为奇数的结点调整到链表的前面,所有值为偶数的结点调整到链表的后面。*//**********************************//*文件名称:lab3_08.c *//**********************************///#include "slnklist.h"/*请将本函数补充完整,并进行测试*/void partion(linklist head){ linklist p,s,pre=head; p=head->next; while(p) { if(p->info%2==0) { pre=p; p=p->next; } else { s=p; pre->next=p->next; p=pre->next; s->next=NULL; s->next=head->next; head->next=s; } }}int main(){ linklist head; head=creatbyqueue(); /*尾插法建立带头结点的单链表*/ print(head); /*输出单链表head*/ partion(head); print(head); delList(head); return 0;}
实验九
/*编写一个程序,用尽可能快的方法返回带头结点单链表中倒数第k个结点的地址,如果不存在,则返回NULL。*//**********************************//*文件名称:lab3_09.c *//**********************************///#include "slnklist.h"/*请将本函数补充完整,并进行测试*/linklist search(linklist head,int k){ int cnt=0,i; linklist p=head->next,q; for(p;p;p=p->next) cnt++; if(cnt<k) return 0; else { p=head; for(i=1;i<=cnt-k+1;i++) p=p->next; } return p;}int main(){ int k; linklist head,p; head=creatbyqueue(); /*尾插法建立带头结点的单链表*/ print(head); /*输出单链表head*/ printf("k="); scanf("%d",&k); p=search(head,k); if (p) printf("%d\n",p->info); else printf("Not Found!\n"); delList(head); return 0;}
头文件
#include <stdio.h>#include <stdlib.h>/**************************************//* 链表实现的头文件,文件名slnklist.h *//**************************************/typedef int datatype;typedef struct link_node{ datatype info; struct link_node *next;} node;typedef node *linklist;/******************************************//*函数名称:creatbystack() *//*函数功能:头插法建立带头结点的单链表 *//******************************************/linklist creatbystack(){ linklist head,s; datatype x; head=(linklist)malloc(sizeof(node)); head->next=NULL; printf("请输入整数序列(空格分开,以0结束):\n"); scanf("%d",&x); while (x!=0) { s=(linklist)malloc(sizeof(node)); s->info=x; s->next=head->next; head->next=s; scanf("%d",&x); } return head;}/***************************************//*函数名称:creatbyqueue() *//*函数功能:尾插法建立带头结点的单链表 *//***************************************/linklist creatbyqueue(){ linklist head,r,s; datatype x; head=r=(linklist)malloc(sizeof(node)); head->next=NULL; printf("请输入整数序列(空格分开,以0结束):\n"); scanf("%d",&x); while (x!=0) { s=(linklist)malloc(sizeof(node)); s->info=x; r->next=s; r=s; scanf("%d",&x); } r->next=NULL; return head;}/**********************************//*函数名称:print() *//*函数功能:输出带头结点的单链表 *//**********************************/void print(linklist head){ linklist p; int i=0; p=head->next; printf("List is:\n"); while(p) { printf("%7d",p->info); i++; if (i%10==0) printf("\n"); p=p->next; } printf("\n");}/******************************************//*函数名称:creatLink() *//*函数功能:从文件中读入n个数据构成单链表 *//******************************************/linklist creatLink(char *f, int n){ FILE *fp; int i; linklist s,head,r; head=r=(linklist)malloc(sizeof(node)); head->next=NULL; fp=fopen(f,"r"); if (fp==NULL) return head; else { for (i=0; i<n; i++) { s=(linklist)malloc(sizeof(node)); fscanf(fp,"%d",&(s->info)); r->next=s; r=s; } r->next=NULL; fclose(fp); return head; }}/* 函数名称:writetofile 函数功能:将链表内容存入文件f*/void writetofile(linklist head, char *f){ FILE *fp; linklist p; int i=0; fp=fopen(f,"w"); if (fp!=NULL) { p=head->next; fprintf(fp,"%s","List is:\n"); while(p) { fprintf(fp,"%7d",p->info); i++; if (i%10==0) fprintf(fp,"%c",'\n'); p=p->next; } fprintf(fp,"%c",'\n'); fclose(fp); } else printf("创建文件失败!");}/**********************************//*函数名称:delList() *//*函数功能:释放带头结点的单链表 *//**********************************/void delList(linklist head){ linklist p=head; while (p) { head=p->next; free(p); p=head; }}
阅读全文
0 0
- 数据结构实验三
- 数据结构实验三
- 【数据结构实验三】串
- 数据结构实验三
- 《数据结构》实验三: 栈和队列实验
- 《数据结构》实验三: 栈和队列实验
- 《数据结构》实验三:栈和队列实验
- 《数据结构》实验三: 栈和队列实验
- 《数据结构》实验三: 栈和队列实验
- 《数据结构》实验三:栈和队列实验
- 数据结构:实验三 栈和队列实验
- 《数据结构》实验三: 栈和队列实验
- 《数据结构》实验三:栈和队列实验
- 《数据结构》实验三: 栈和队列实验
- 《数据结构》实验三: 栈和队列实验
- 《数据结构》实验三: 栈和队列实验
- 《数据结构》实验三:栈和队列实验
- 《数据结构》实验三: 栈和队列实验
- adb操作命令详解及大全
- 字典排序问题——在value的基础上对key排序
- 表格内容位置原则
- windows2003中未分页内存泄漏导致服务器不稳定的解决方法
- unsigned int reverse_bit(unsigned int value);这个函数的返回 值value的二进制位模式从左到右翻转后的值。
- 数据结构实验三
- 如何搭建ubuntu的全志A33编译环境
- ehco $$中$$的意义
- 数据结构总结--一起学习
- 版本差异对比 -- 前言(一)
- Dos窗口的常见打开方式和常见命令
- ssm整合
- 蓝桥杯 入门训练 圆的面积
- js从后台获取数据时,防止页面缓存问题,url后加时间戳