数 据 结 构 课 程 设 计 设计题目: 两个链表的交叉合并 专业班级:08 软件工程3 班 姓名:xxxxxx 学号: 080107031123 设计时间:2010/9/25 指导教师:杨薇薇 一、 设计题目 实现两个链表的合并 设计目的 1.掌握线性链表的建立。 2.掌握线性链表的基本操作。 设计内容和要求 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。 3. 用直接插入排序法对 C进行升序排序,生成链表 D,并输出链表 D。 4. 能删除指定单链表中指定位子和指定值的元素。 二、 运行环境(软、硬件环境) 软件环境: VC++6.0编程软件,运行平台:Win32 硬件:普通个人 pc机、 算法设计的思想 三、 算法的流程图 cmd=0 cmd=1 错误输入 正确 错误 正确 错误 开始 Creat A 链表 Creat B 链表 对C 排序生成D 提示输入0 或1 Mergel(A,B) 交叉合并成输入将要操作的链表的名字 输入将要操作的链表的名字 Cmd error 删除,打印 Nameerror 删除,打印 Nameerror 打印“over” 结束 四、 算法设计分析 这个两个链表的交叉合并算法主要运用到的是链表的基本操作,定义节点,将链表的创建、计算链表的长度、链表 A,B的交叉组合、链表内容升序排列、删除链表指定位置元素、删除指定的元素等算法写成了独立函数,通过主函数调用。这样就大大精简了主函数的操作。但主函数中很大篇幅用到了 if、else语句,用以指定链表指定结点和指定元素的删除操作,这样就使得本来很精简变得繁琐,降低了程序的质量。所以其有优点和缺点,但需要不断的改进,不断优化该程序。 五、 源代码 程序源代码: #include #include typedef struct node //节点定义 { int data; struct node *next; } node,*linklist; linklist creat(linklist head) //该函数用来创建链表 { node *r,*s; int a; r = (linklist)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(linkl...