数据结构课程设计实现两个链表的合并.docx
- 文档编号:1974269
- 上传时间:2022-10-25
- 格式:DOCX
- 页数:16
- 大小:154.33KB
数据结构课程设计实现两个链表的合并.docx
《数据结构课程设计实现两个链表的合并.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计实现两个链表的合并.docx(16页珍藏版)》请在冰豆网上搜索。
数据结构课程设计实现两个链表的合并
一、课程设计题目:
实现两个链表的合并
二、基本功能要求:
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
3.输出线性表C:
用直接插入排序法对C进行升序排序,生成链表D,并输出链表D。
三、测试数据:
1.A表(30,41,15,12,56,80)
B表(23,56,78,23,12,33,79,90,55)
2.A表(30,41,15,12,56,80,23,12,34)
B表(23,56,78,23,12)
四、理论分析结果:
1.A表的数据元素个数m=6,B表的数据元素个数n=9,此时m 分析合并结果: 当m C=23,30,56,41,78,15,23,12,12,56,33,80,79,90,55 排序结果: D=12,12,15,23,23,30,33,41,55,56,56,78,79,80,90 2.A表的数据元素个数m=9,B表的数据元素个数n=5,此时m>n 分析合并结果: 当m>=n时,应该先插入A表中的数据元素,在偶数位插入A表中的数据元素,在奇数位插入B表中的数据元素,最后插入A表中剩余的数据元素。 C=30,23,41,56,15,78,12,23,56,12,80,23,12,34 排序结果: D=12,12,12,15,23,23,23,30,34,41,56,56,78,80 五、设计步骤: 5.1分析问题,给出数学模型,设计相应的数据结构: 1)分析问题特点,用数学表达式或其它形式描述其数学模型。 2)选择能够体现问题本身特点的一种或几种逻辑结构。 3)依据逻辑结构和问题特点,设计并选择相应的存储结构(顺序存储结构和链式存储结构对应的算法实现有区别)。 5.2算法设计: 1)确定所需模块: 对于复杂的程序设计,要充分利用模块化程序设计方法和面向对象思想,自顶向下,逐步细化。 2)各子模块功能描述: 给出主要模块的算法描述,用流程图或伪代码表示。 3)模块之间的调用关系: 给出算法各模块之间的关系图示。 5.3上机实现程序: 为提高工作效率,充分利用上机调试时间,在上机之前应列出程序清单。 5.4有代表性的各种测试数据去验证算法及程序的正确性: 根据课程设计的要求对给定的数据进行测试,验证算法以及程序的正确性。 5.5算法分析及优化: 经过上机调试,源程序运行正确,并且实现算法要求的功能,解决课程设计题目中给出的问题后,分析算法的时间复杂度和空间复杂度,如有可能对程序进行优化改进。 六、模块划分: 1.单链表头文件: LinList.h 主要包括单链表的存储结构、初始化、求数据元素个数、插入、删除数据元素、取数据元素、撤消单链表的函数。 2.单链表操作头文件: MyList.h 主要包括单链表测试、单链表合并、单链表合并排序函数。 3.测试主函数文件: TestLinList.h 主要包括文件包含、数据导入和操作模块程序。 七、算法设计: 7.1带头结点的单链表存储结构 typedefstructNode { DataTypedata; structNode*next; }SLNode; 7.2单链表的初始化 voidListInitiate(SLNode**head) { /*如果有内存空间,申请头结点空间并使头指针head指向头结点*/ if((*head=(SLNode*)malloc(sizeof(SLNode)))==NULL) exit (1); (*head)->next=NULL;/*尾标记NULL*/ } 7.3求单链表中的数据元素个数 intListLength(SLNode*head) { SLNode*p=head;/*p指向头结点*/ intsize=0;/*size初始为0*/ while(p->next! =NULL)/*循环计数*/ { p=p->next;size++; } returnsize; } 7.4向单链表中插入数据元素 intListInsert(SLNode*head,inti,DataTypex) { SLNode*p,*q; intj; p=head; j=-1; while(p->next! =NULL&&j { p=p->next;j++; } if(j! =i-1) { printf("Eorror: 插入位置参数错! \n"); return0; } if((q=(SLNode*)malloc(sizeof(SLNode)))==NULL) exit (1); q->data=x; q->next=p->next; p->next=q; return1; }//注: 此单链表是带头结点的 7.5从单链表中删除数据元素 intListDelete(SLNode*head,inti,DataType*x) { SLNode*p,*s;intj; p=head; j=-1; while(p->next! =NULL&&p->next->next! =NULL&&j { p=p->next;j++; } if(j! =i-1) { printf("Eorror: 删除位置参数错! \n"); return0; } s=p->next; *x=s->data; p->next=p->next->next; free(s); return1; } 7.6从单链表中取数据元素 ListGet(SLNode*head,inti,DataType*x) { SLNode*p; intj; p=head; j=-1; while(p->next! =NULL&&j { p=p->next;j++; } if(j! =i) { printf("Eorror: 取数据元素位置参数出错! \n"); return0; } *x=p->data; return1; } 7.7撤消单链表 voidDestroy(SLNode**head) { SLNode*p,*p1; p=*head; while(p! =NULL) { p1=p;p=p->next;free(p1); } *head=NULL; } 7.8单链表测试函数 voidSingleList(inta[],intal) { inti,x; SLNode*head; ListInitiate(&head); //向单链表插入数据元素 for(i=0;i { if(ListInsert(head,i,a[i])==0) { printf("Error: 插入数据元素错误! \n");return; } } //从单链表取数据元素 printf("结果: "); for(i=0;i { if(ListGet(head,i,&x)==0) { printf("Error: 取数据元素错误! \n");return; } elseprintf("%d",x); } printf("\n"); Destroy(&head);//撤消单链表 printf("\n"); } 7.9单链表合并函数 voidCombineList(inta[],intb[],intal,intbl) { inti,j=0,x; int*list; SLNode*head; list=(int*)malloc((al+bl)*sizeof(int)); if(al { //较长数组的数据元素赋给动态数组的偶数位 for(i=0;i<2*al;i+=2) { if(i%2==0) { list[i]=b[j];j++; } } j=0;//恢复公共下标初始值 //较短数组的数据元素赋给动态数组的奇数位 for(i=0;i<2*al;i++) { if(i%2==1) { list[i]=a[j];j++; } } //较长数组剩余数据元素赋值 for(i=2*al;i { list[i]=b[j];j++; } } else//a[]数组的数据元素个数>=b[]数组的数据元素个数 { //较长数组b[]的数据元素赋给动态数组的偶数位 for(i=0;i<2*bl;i+=2) { if(i%2==0) { list[i]=a[j];j++; } } j=0;//恢复公共下标初始值 //较短数组a[]的数据元素赋给动态数组的奇数位 for(i=0;i<2*bl;i++) { if(i%2==1) { list[i]=b[j];j++; } } //较长数组a[]剩余数据元素赋值 for(i=2*bl;i { list[i]=a[j];j++; } } ListInitiate(&head); //向单链表插入数据元素 for(i=0;i { if(ListInsert(head,i,list[i])==0) { printf("Error: 插入A的数据元素错误! \n"); } } free(list); //从单链表取数据元素 for(i=0;i { if(ListGet(head,i,&x)==0) { printf("Error: 取数据元素错误! \n");return; } else printf("%d",x); } printf("\n"); Destroy(&head);//撤消单链表 } 7.10直接插入法排序 for(i=0;i { temp=list[i+1]; j=i; while(j>-1&&temp { list[j+1]=list[j];j--; } list[j+1]=temp;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 实现 两个 合并