《2022年2022年计算机软件基础实验二 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年计算机软件基础实验二 .pdf(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1 实验报告课程(项目)名称:计算机软件技术基础实验二(链表)学院:专业:班级:学号:姓名:成绩:2009年11 月8 日名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 16 页 - - - - - - - - - 2 一实验目的(1) 掌握链表的概念。(2) 熟练掌握线性表的链式存储结构。(3) 熟练掌握线性表在链式存储结构上的运算。二算法设计方案与实施过程1. 实验内容简述(1) 编写算法,根据用户输入的字符数据分别用尾插法和头插法创建一个带头结点的单链表,#作为输入
2、数据的结束符。 (2)编写算法,在带有头结点的单链表中查找序号为i 的结点和值为x 的结点并输出。 (3)已知单链表中的数据元素递增有序,编写算法,删除表中值在min 与 max之间的结点。(4) 己知单链表中的元素非递减有序排列,编写算法删除单链表中值相同的多余的元素。2. 算法设计思想尾插法创建头结点,第一次建立的新结点链给头结点,以后创建的新结点链到上一个结点,把最后一个结点的next 赋空。返回头结点,就得到整个链表!头插法创建头结点,将h-next作为尾结点,第一次建立的新结点的next 链给尾结点,以后创建的新结点 next 链到上一个结点,最后一个结点链给头结点后面。返回头结点,
3、就得到整个链表!按序号查找从头一次往下查找,每查找一次将计数器加一,当计数器和要查找的序号一致时,结束循环,输出所查找的结点对应的数据。按值查找从头往下查找,每查找一次计数器加一,当查找值和表中值一致时结束循环,输出查找的元素和对应的序号,当循环一直进行,找不到要查找的元素时,输出无此元素!删除 min 和 max之间的元素从头往下查找,当查找到min 时结束第一次循环,当查找到max时结束第二次循环,将min 和 max链起来,将中间的结点释放。返回头结点!删除多余的元素依次往下查找,当两个相邻的元素相等时,链到下一个元素,释放重复的元素!返回头结点!3. 算法模块流程图名师资料总结 - -
4、 -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 16 页 - - - - - - - - - 3 4. 源程序清单创建链表:#include #include typedef char datatype; typedef struct node datatype data; struct node *next; LinkList; / 尾插法LinkList *createlist( ) LinkList *h,*p,*q; char ch; h=(LinkList *)malloc(siz
5、eof(LinkList); printf(n Please input the Link List node values(End by #)n); p=h; ch=getchar(); while(ch!=#) q=(LinkList *)malloc(sizeof(LinkList); q-data=ch; p-next=q; p=q; ch=getchar(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 16 页 - - - - - - - - - 4 p-
6、next=NULL; return h; / 头插法LinkList *createlist2( ) LinkList *q,*h; char ch; h=(LinkList *)malloc(sizeof(LinkList); printf(n Please input the Link List node values(End by #)n); h-next=NULL; ch=getchar(); while(ch!=#) q=(LinkList *)malloc(sizeof(LinkList); q-data=ch; q-next=h-next; h-next=q; ch=getcha
7、r(); return h; void output(LinkList *h) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 16 页 - - - - - - - - - 5 LinkList *p1=NULL; p1=h-next; while(p1!=NULL) printf(%c ,p1-data); p1=p1-next; printf(n); void main() int choose=0; LinkList *h=NULL; printf(选择 1-尾插法
8、,选择2- 头插法 n); scanf(%d,&choose); switch(choose) case 1: h=createlist(); printf(尾插法链表为 :); output(h); break; case 2: h=createlist2(); printf(头插法链表为 :); output(h); break; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 16 页 - - - - - - - - - 6 查找:#include #include
9、 typedef char datatype; typedef struct node datatype data; struct node *next; LinkList; / 尾插法LinkList *createlist( ) LinkList *h,*p,*q; char ch; h=(LinkList *)malloc(sizeof(LinkList); printf(n Please input the Link List node values(End by #)n); p=h; ch=getchar(); while(ch!=#) q=(LinkList *)malloc(si
10、zeof(LinkList); q-data=ch; p-next=q; p=q; ch=getchar(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 16 页 - - - - - - - - - 7 p-next=NULL; return h; void find1(LinkList *h) LinkList *p,*q; int i=0,j=0; printf(输入要查找的序号:n); scanf(%d,&i); if(i=1) q=h-next; else
11、p=h-next; j=1; while(p!=NULL) p=p-next; j+; if(i=j) q=p; break; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 16 页 - - - - - - - - - 8 if(p=NULL) printf(超出范围,不存在); else printf(查找的元素为:); printf(%c,q-data); void find2(LinkList *h) LinkList *p; char ch; int j=0;
12、printf(input ch:n); scanf(%c,&ch); p=h-next; j=1; while(p!=NULL&p-data!=ch) p=p-next; j+; if(p=NULL) printf(你所输入的值不存在!n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 16 页 - - - - - - - - - 9 else printf(第%d个元素为 %cn,j,p-data); void main() int choose=0; LinkLi
13、st *h=NULL; h=createlist(); printf(选择 1-按序号查找,选择2- 按值查找 n); scanf(%d,&choose); switch(choose) case 1: find1(h); break; case 2: find2(h); break; 删除 min 和 max之间的函数:#include #include typedef struct node int data; struct node *next; LinkList; /* 创建链表 */ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - -
14、 - - - 名师精心整理 - - - - - - - 第 9 页,共 16 页 - - - - - - - - - 10 LinkList * create1( ) LinkList *h,*p,*q=NULL; int x; h=NULL; h=(LinkList *)malloc(sizeof(LinkList); printf(n Please input the Link List node values(End by -1)n Node value is:); q=h; scanf(%d,&x); if(x=-1) return NULL; while(x!=-1) if(xq-d
15、ata) p=(LinkList *)malloc(sizeof(LinkList); p-data=x; q-next=p; scanf(%d,&x); q=p; else printf(please input the larger figure.n); printf(Node value is:); scanf(%d,&x); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 16 页 - - - - - - - - - 11 q-next=NULL; return
16、 h; void delm(LinkList *h, int min, int max) LinkList *p,*q,*s; s=(LinkList *)malloc(sizeof(LinkList ); if(p=h-next)=NULL) return; while(p-data!=min) p=p-next; q=p-next; while (q-datanext; p-next=q; printf(删掉的元素为 :%dn ,s-data); free(s); return; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - -
17、- 名师精心整理 - - - - - - - 第 11 页,共 16 页 - - - - - - - - - 12 void output(LinkList *h) LinkList *p1=NULL; for(p1=h-next;p1!=NULL;p1=p1-next) printf(%4d,p1-data); /* 主函数 */ void main() int min,max; LinkList *h=NULL; h=create1(); printf(输入最小值min:n); scanf(%d,&min); printf(输入最大值max:n); scanf(%d,&max); delm
18、(h,min,max); output(h); 删除多余元素:#include #include typedef char datatype; typedef struct node 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 16 页 - - - - - - - - - 13 datatype data; struct node *next; LinkList; / 尾插法LinkList *createlist( ) LinkList *h,*p,*q; cha
19、r ch; h=(LinkList *)malloc(sizeof(LinkList); printf(n Please input the Link List node values(End by #)n); p=h; ch=getchar(); while(ch!=#) q=(LinkList *)malloc(sizeof(LinkList); q-data=ch; p-next=q; p=q; ch=getchar(); p-next=NULL; return h; LinkList *deld(LinkList *h ) LinkList *p,*q,*s; p=h-next; if
20、(p=NULL) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 16 页 - - - - - - - - - 14 return h; else q=p-next; while(q!=NULL) if(p-data=q-data) s=q; q=q-next; p-next=q; free(s); else p=p-next; q=q-next; return h; void output(LinkList *h) LinkList *p1=NULL; p1=h-ne
21、xt; while(p1!=NULL) printf(%c ,p1-data); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 16 页 - - - - - - - - - 15 p1=p1-next; printf(n); void main() LinkList *h; h=createlist(); h=deld(h); output(h); 5. 调试数据及运行结果分析函数测试数据运行结果尾插法abcdef# a b c d e f 1 2 3 4 5 6 #
22、 1 2 3 4 5 6 头插法abcdef# f e d c b a 1 2 3 4 5 6 # 6 5 4 3 2 1 按序号查找abcdef# 2 b abcdef# 4 d 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 16 页 - - - - - - - - - 16 按值查找abcdef# b 第 2 个元素为 b abcdef# e 第 5 个元素为 e 删除 min 和 max之间的元素1 2 3 4 5 6 7 -1 2 5 1 2 5 6 7 1
23、2 3 4 5 6 7 8 -1 3 7 1 2 3 7 8 删除多余元素abbcdeeef# a b c d e f abccddeef# a b c d e f 三实验总结1. 遇到的问题在做尾插法的时候:由于在创建头结点的时候又将头结点赋空,导致不能正常运行;也出现了一些简单的错误,比如输出函数时输出的数据类型写错。在做查找的时候:按序号查找时能正常运行,但是按值查找时却不能正常输入查找值。在这个过程中,也出现了比如ch 写为 ch的错误!以及计数器首次计数的错误。在做删除min 和 max之间元素时:在形参的使用上出了错误,在结点链接上也因为链接错误,而不能执行程序。发现问题后,及时的改正相应的错误,是函数正确运行!2. 实验收获经过实验之后,对链表的概念,链表的链式存储结构以及线性表在链式存储结构上的运算有了一个更深、更直观的了解。经过不断地犯错,纠错的过程中也发现自己很多从语言方面的不足,以及对知识的了解和把握不足的问题。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 16 页 - - - - - - - - -