版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上一、 需求分析: 题目: 实现两个链表的合并 问题描述: 1. 建立两个链表A和B,链表元素个数分别为m和n个。 2. 假设元素分别为(x1,x2,xm),和(y1,y2, yn)。把它们合并成一个线形表C,使得: 当m>=n时,C=x1,y1,x2,y2,xn,yn,xm 当n>m时,C=y1,x1,y2,x2,ym,xm,yn 输出线性表C。 由题目的相关信息可以分析得到:首先我们需要建立两个链表AB,A链表的元素个数为m;B链表的元素个数为n;在将AB链表进行合并,更具m和n的大小关系决定链表C的元素顺序;再将C经行直接插入排序得到一个新的链表D;最
2、后输出ABCD的相关信息。 开始二、 算法的流程图 Creat A 链表 Creat B 链表Mergel(A,B) 合并成C 对C排序生成D 提示输入0或1cmd=0 cmd=1 错误输入输入将要操作的链表的名字Cmd error输入将要操作的链表的名字正确 错误 正确 错误Nameerror删除,打印Nameerror删除,打印 打印“over”结束三、 算法设计分析 这个两个链表的交叉合并算法主要运用到的是链表的基本操作,定义节点,将链表的创建、计算链表的长度、链表A,B的交叉组合、链表内容升序排列、删除链表指定位置元素、删除指定的元素等算法写成了独立函数,通过主函数调用。这样就大大精简
3、了主函数的操作。但主函数中很大篇幅用到了if、else语句,用以指定链表指定结点和指定元素的删除操作,这样就使得本来很精简变得繁琐,降低了程序的质量。所以其有优点和缺点,但需要不断的改进,不断优化该程序。四、 源代码 程序源代码:#include<stdio.h>#include<stdlib.h>typedef struct node /节点定义 int data; struct node *next; node,*linklist;linklist creat(linklist head) /该函数用来创建链表 node *r,*s; int a; r = (lin
4、klist)malloc(sizeof(node); head = r; scanf("%d",&a); while(a != 0) s =(node*)malloc(sizeof(node); s->data=a; r->next=s; r=s; printf("please input a data:"); scanf("%d",&a); r->next=NULL; return head;linklist length(linklist l) / 返回L中数据元素个数int i=0;linkli
5、st p=l->next; / p指向第一个结点while(p) i+; p=p->next; return i;linklist mergel(linklist A,linklist B) /用于实现链表A,B的交叉组合 int m,n; node *p,*q,*s,*t; linklist C; p=A->next; q=B->next; m=length(A); n=length(B); C=A; if(m<n) p=B->next;q=A->next;C=B; while(p&&q) s=p->next; p->ne
6、xt=q; if(s) t=q->next; q->next=s; p=s; q=t; return C; linklist sort(linklist L) /链表内容升序排列 linklist p,q,min; int temp; p=L; while( p=p->next ) q=min=p; while(q=q->next) if( q->data<min->data ) min = q; if( min!=p ) temp = p->data; p->data = min->data; min->data=temp;
7、return L;linklist Delete(linklist l,int index) /删除链表指定位置元素 linklist p,t; int cx=1; /用于计数 p=l; if(index<length(l) while(p&&(cx<index) t=p; p=p->next; cx+; t->next=p->next; else printf("input indext error");return l;linklist Delete_element(linklist l,int data) /删除指定的元素
8、 linklist p; p=l; if(p->next) while(p->next->data!=data) p=p->next; p->next=p->next->next; else printf("don't faind the element"); return l;linklist display(linklist l) /打印 linklist p;printf("new linklist :n");p = l->next;while(p) printf("%dn"
9、;,p->data);p= p->next; return l; main() linklist p,q,A,B,C,D;int indexs;int datas;char name;int cmd; printf("Creat linklist A:n"); /创建A链表,并打印 printf("please input a data:");A = creat(A); printf("Creat linklist B:n"); /创建B链表,并打印printf("please input a data:&quo
10、t;); B = creat(B); C = mergel(A,B); /生成C链表 ,并打印 printf("linklist Cn");p = C->next; while(p) printf("%dn",p->data); p=p->next; D=C; /对C进行排序生成D sort(D); printf("linklist D:n");q = D->next; while(q) printf("%dn",q->data); q = q->next; printf(&qu
11、ot;nplease input 0 or 1 n"); /用1和0判断是按位置删除还是直接删除元素scanf("%d",&cmd);if(cmd=0) /位置删除 printf("please input linklist namen ");fflush(stdin);scanf("%c",&name);printf("nplease input index n"); scanf("%d",&indexs);fflush(stdin);if(name='
12、;A')Delete(A,indexs); display(A);else if(name='B')Delete(B,indexs);display(B);else if(name='C')Delete(C,indexs);display(C);else if(name='D')Delete(D,indexs);display(D);else printf("nameError"); else if(cmd=1) /元素删除 fflush(stdin); /清除缓冲 printf("please input
13、linklist namen ");/fflush(stdin);scanf("%c",&name);printf("nplease input datas n");scanf("%d",&datas);if(name='A')Delete_element(A,datas);display(A);else if(name='B')Delete_element(B,datas);display(B);else if(name='C') Delete_element
14、(C,datas); display(C);else if(name='D')Delete_element(D,datas); display(D);else printf("name2error"); else printf("cmdError");printf("nOvern"); getchar(); return 0; 六、实验运行结果显示:设计体会及今后改进的意见;短短一周的数据结构课程设计结束了,回想着这一周自己的表现,感觉不是很满意,感到自己许多不足之处。但同时通过本次课程设计,我也收获了不少。这次课程设计我做的是实现两个链表的合并,由于有C语言的编程,而编程一直对我来说就是一个弱项,我觉的我选的这个题比较基础,自己也有一些思路,但在程序编写过程中还是遇到了不少问题,在开始前,我查阅相关资料,对这次课程谁过程中用到的知识做出了一个系统的归纳:如链表的建立、链表的合并、直接插入排序以及SWITCH语句 等知识点。但在板鞋程序过程中还是遇到了一些问题。经过修改、调试、运行然后再修改、调试、运行,有时虽然能运行,但对本次实验来说缺少一定程度的完整性,然后就上网查资料,在书上查看相关方面的知识,当编写的程序感觉符合要求
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 一年级上美术教学设计-贴树叶-赣美版
- 五年级下册英语学案 - Unit2 My favourite season lesson4 - 人教(PEP)
- 基于深度学习的多维互动教学模式设计
- 中国网络电影行业深度分析、投资前景、趋势预测报告(智研咨询)
- 《我有一双小巧手 百变纸杯》(教学设计)-苏教版劳动二年级上册
- 湖北省阳新县2024届中考语文适应性模拟试题含解析
- 1《北京的春节》(教学设计)统编版语文六年级下册
- 《梯形的认识》教学教案
- 1《白鹭》(教案)五年级上册语文统编版
- 2024年下学期教研工作计划3篇
- 让思维活跃起来 心理健康七年级全一册
- 广州市近5年中考语文作文真题及模拟题汇编(含参考例文)
- smt元器件焊接强度推力测试标准
- 语音信号降噪方案
- 安全评价课程设计任务书
- 建设项目审计造价审计及案例分析
- 暑假安全教育课件(共50张PPT)
- 2023年新疆省和田地区六年级数学第二学期期末检测模拟试题含解析
- 第三届农作物植保员技能大赛理论考试参考试题库(含答案)
- 广州天河区2023年三年级数学第二学期期末学业水平测试试题含解析
- 2022-2023学年山东省威海市荣成第一中学高一数学理期末试卷含解析
评论
0/150
提交评论