课程设计报告课程设计题目:两个链表的合并专业:软件工程班级:姓名:学号:指导教师:年月日目录1.课程设计的目的及要求2.课程设计的容(分析和设计)3.算法流程图4.详细步骤5.代码6.显示结果7.课程设计的总结一.课程设计的目的及要求1.目的:实现两个链表的合并2.要求:(1)建立两个链表A和B,链表元素个数分别为m和n个。
(2)假设元素分别为(x1,x2,...xm),和(y1,y2, ...yn)。
把它们合并成一个线形表C,使得:当m>=n时,C=x1,y1,x2,y2,...xn,yn, (x)当n>m时,C=y1,x1,y2,x2,…ym,xm,…,yn输出线形表C(3)用直接插入排序法对C进行升序排序,生成链表D,并输出链表D。
(4)能删除指定单链表中指定位子和指定值的元素。
二.课程设计的容(分析和设计)1..分析由题目的相关信息可以分析得:首先我们需要建立两个链表AB,A链表的元素个数为m,B链表的元素个数为n;在将A、B链表进行合并,根据m和n的大小关系决定链表C的元素顺序;再将C进行直接插入排序得到一个新的链表D;没次输入完一次链表信息,程序都会对相应的链表进行输入操作以此确保程序输入的数据是你想要输入的数据。
同时当你合并好和排序好后都会进行输出操作。
最后当排序好后你可以指定你所要删除数据的位置来删除你所要删除的数据。
2.设计本次课程设计所需要用到的是关于链表的建立、合并以及直接插入排序的排序算法。
需要先建立两个链表,再将其合并为一个无序链表,最后对这个无序链表进行直接插入排序并将其输出。
难点在于将AB合并为链表C的操作以及对链表C进行直接插入排序的操作和根据用户的意愿可以对链表进行删除的操作。
三.算法流程图四.详细步骤(1)结构体的创建:struct Node(2)链表的创建:struct Node *create()链表的创建。
(3)链表的输出:void print(struct Node *head)功能是对链表进行输出。
(4)链表的合并:struct Node * inter_link(struct Node * chain1, int a, struct Node *chain2, int b)算法的功能是实现两个链表的交叉合并,并且可以根据两链表的长短将行不通的插入。
(5)排序:void InsertSort(struct Node *p,int m)算法的功能是对一合并好的链表进行升序插入排序。
(6)按位删除操作:struct Node * delete_link(struct Node *p,int i)。
(7)按值删除操作:struct Node * delete_linkz(struct Node *p,int i)。
(8)主函数:main()函数主要是对算法进行测试。
五.代码struct Node //数据结构定义如下:{long int number;struct Node *next;}Node,*linkList;#include<stdlib.h> //源程序:#include<stdio.h>#include<conio.h>#include<malloc.h>#define error 0#define null 1#define L sizeof(struct Node)struct Node *create(int a)//链表创建函数{int n;struct Node *p1, *p2, *head;head = NULL;n = 0;p2 = p1 = (struct Node *) malloc(L); //分配存scanf("%ld", &p1->number);while (a)//录入链表信息{n = n + 1;if (n == 1)head = p1;elsep2->next = p1;p2 = p1;p1 = (struct Node *) malloc(L);if (a != 1)//分配存scanf("%ld", &p1->number);a--; //控制输入的个数}p2->next = NULL;return (head);}//链表创建函数结束void print(struct Node *head)//输出函数{struct Node *p;p = head;printf("数字:\n");if (head != NULL)do//循环实现输出{printf("%ld", p->number);printf(" ");p = p->next;} while (p != NULL);printf("\n");}//链表的交叉合并算法struct Node * inter_link(struct Node * chain1, int a, struct Node * chain2, int b) { int temp;struct Node *head, *p1, *p2, *pos;/*判断a,b大小并合并*/if (a >= b) {head = p1 = chain1;p2 = chain2;} else/*b>a*/ {head = p1 = chain2;p2 = chain1;temp = a, a = b, b = temp; /*交换a和b*/}/*下面把p1的每个元素插在p2相应元素之前,p1长a,p2长b*/pos = head; /*此时pos指向p1中的第一个元素*/while (p2 != NULL) {//漂亮,蛇形插入p1 = p1->next;pos->next = p2;pos = p2;p2 = p2->next;pos->next = p1;pos = p1;}return head;}//对合并好的链表进行排序void InsertSort(struct Node *p, int m)//排序函数{int i, j, t;struct Node *k;k = p;for (i = 0; i < m - 1; i++) {for (j = 0; j < m - i - 1; j++) {if (p->number > (p->next)->number) {t = p->number;p->number = (p->next)->number;(p->next)->number = t;}p = p->next;}p = k;}}struct Node * delete_link(struct Node *p,int i) //按位删除{ struct Node *q;int j=0;while(j<i-1&&p->next){ p=p->next;j++;}if(j==i-1&&p->next){q=p->next;p->next=q->next;free(q);}else return error;}struct Node * delete_linkz(struct Node *p,int i)//按值删除{ struct Node *q;struct Node *k;int j=0;int h=0;while(p&&p->number!=i)p=p->next;j++;if (p){while (h<j-1&&p->next){p=p->next;h++;}if(h==j-1&&p->next){k=p->next;p->next=k->next;free(k);}}elsereturn error;}//主函数int main()//main函数{struct Node *p1, *p2;int a;int b;int h;int t;int m;printf("请输入第一个链表:\n");printf("\n输入链表的长度a:\n");scanf("%d", &a);printf("请输入链表数据:");p1 = create(a);printf("\n你刚才输入的第一个链表信息:\n ");print(p1);printf("\n 请输入第二个链表:\n");printf("\n输入链表的长度b:\n");scanf("%d", &b);printf("请输入链表数据:");p2 = create(b);printf("\n你刚才输入的第二个链表的信息:\n");print(p2);p1 = inter_link(p1, a, p2, b);h = a + b;printf("\n合并后的链表\n:");print(p1);InsertSort(p1, h);printf("\n排序后的链表:\n");print(p1);printf("\n请输入链表中你所要删除数据的所在位置:\n");scanf("%d",&t);delete_link(p1,t);printf("\n链表删除数据后链表的信息:\n");print(p1);printf("\n请输入你想要删除的数值:\n");scanf("%d",&m);delete_linkz(p1,m);printf("\n链表删除数据后链表的信息:\n");print(p1);return 0;}六.显示结果(1)m<n(2)m>n3.m=n4.按位删除操作5.按值删除七.课程设计的总结通过进一周的学习和实践,解决实际问题,让我对链表有了更深的了解,也让我提高了解决实际问题的能力。
在上机的同时改正了自己对某些算法的错误使用,使自己在通过程序解决问题时抓住关键算法,有了算法设计思想和流程图,并用C语言描绘出关键算法。