数据结构课程设计 实验报告 心得体会 链表 C语言
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数
据
结
构
课
程
设
计
设计题目: 两个链表的交叉合并
专业班级: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, (x)
当n>m时,C=y1,x1,y2,x2,…ym,xm,…,yn
输出线性表C。
3. 用直接插入排序法对C进行升序排序,生成链表D,并输出链表D。
4. 能删除指定单链表中指定位子和指定值的元素。
二、运行环境(软、硬件环境)
软件环境: VC++6.0编程软件,运行平台:Win32
硬件:普通个人pc机、算法设计的思想
三、算法的流程图
四、算法设计分析
这个两个链表的交叉合并算法主要运用到的是链表的基本操作,定义节点,将链表的创建、计算链表的长度、链表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(linklist l) // 返回L中数据元素个数
{
int i=0;
linklist 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 { p=B->next; q=A->next; C=B; } while(p&&q) { s=p->next; p->next=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 = q; } if( min!=p ) { temp = p->data; p->data = min->data; min->data=temp; } } return L; } linklist Delete(linklist l,int index) //删除链表指定位置元素{ linklist p,t; int cx=1; //用于计数 p=l; if(index { while(p&&(cx { t=p; p=p->next; cx++; } t->next=p->next; } else