实现两个链表的合并 实训(1)
来源:互联网 发布:育知同创教育 编辑:程序博客网 时间:2024/06/15 10:51
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;
(3)用冒泡排序法对C进行升序排序,生成表C,并输出表A、B、C、D。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct data
{
intnum;
structdata * next;
}Data, *pData;
pData bubbldsort(pData C)
{
if(NULL==C->next)
{
printf("C表为空,请返还输入\n");
returnNULL;
}
pDatamiddle;
pDatap;
pDataD;
pDatap1;
middle= (pData)malloc(sizeof(Data)); //建立D链表;
middle->num= C->num;
middle->next= NULL;
D= middle;
p= middle;
middle= NULL;
p1= C->next;
while(NULL!=p1)
{
middle= (pData)malloc(sizeof(Data));
middle->num= p1->num;
middle->next= NULL;
p->next= middle;
p= middle;
middle= NULL;
p1= p1->next;
}
intnum;
for(middle=D->next; NULL!=middle->next; middle=middle->next)
{
for(p=middle->next; NULL!=p; p=p->next)
{
if(middle->num > p->num) //这里只是交换数值,交换结点,请看第四题;
{
num= p->num;
p->num= middle->num;
middle->num= num;
}
}
}
returnD;
}
pData create(void) //新建链表;
{
pDatamiddle;
pDatals;
pDatap;
intn;
printf("请输入表的数据长度:");
scanf("%d",&n);
middle= (pData)malloc(sizeof(Data)); //头结点;
middle->num= n; //头结点的数据域用于存放长度n;
middle->next= NULL;
ls= middle;
p= middle;
middle= NULL;
printf("请输入数据");
while(n>0)
{
middle= (pData)malloc(sizeof(Data));
scanf("%d",&middle->num);
middle->next= NULL;
p->next= middle;
p= middle;
middle= NULL;
--n;
}
returnls;
}
void export(pData ls)
{
if(NULL==ls->next)
{
printf("链表为空!");
return;
}
for (ls=ls->next; NULL!=ls; ls=ls->next)
{
printf("%d\t", ls->num);
}
printf("\n");
}
pData merge(pData A, pData B)
{
pDataC;
if(NULL==A->next)
{
C= A;
returnC;
}
if(NULL==B->next)
{
C= B;
returnC;
}
pDatamiddle;
pDatap;
middle= (pData)malloc(sizeof(Data)); //头结点;
middle->next= NULL;
C= middle;
p= middle;
middle= NULL;
intm;
intn;
m= A->num;
n= B->num;
A= A->next;
B= B->next;
if(m >= n)
{
while(NULL != B)
{
middle= (pData)malloc(sizeof(Data));
middle->num= A->num;
middle->next= NULL;
p->next= middle;
p= p->next;
middle= NULL;
middle= (pData)malloc(sizeof(Data));
middle->num = B->num;
middle->next= NULL;
p->next = middle;
p= p->next;
middle= NULL;
A= A->next;
B= B->next;
}
if(NULL== A)
{
returnC;
}
else
{
while(NULL != A)
{
middle= (pData)malloc(sizeof(Data));
middle->num= A->num;
middle->next= NULL;
p->next= middle;
p= p->next;
middle = NULL;
A= A->next;
}
}
}
else
{
while(NULL != A)
{
middle= (pData)malloc(sizeof(Data));
middle->num= B->num;
middle->next= NULL;
p->next = middle;
p= p->next;
middle= NULL;
middle= (pData)malloc(sizeof(Data));
middle->num = A->num;
middle->next= NULL;
p->next = middle;
p= p->next;
middle= NULL;
A= A->next;
B= B->next;
}
while(NULL != B)
{
middle= (pData)malloc(sizeof(Data));
middle->num= B->num;
middle->next= NULL;
p->next= middle;
p= p->next;
middle= NULL;
B= B->next;
}
}
returnC;
}
int main(void)
{
pDataA, B;
printf("建立A表!");
A= create(); //建立A表;
printf("建立B表!");
B= create(); //建立B表;
pDataC;
C= merge(A, B); //合并A、B表,生成C表;
printf("链表C中的数据为\n");
export(C); //输出C表;
pDataD;
D= bubbldsort(C); //冒泡排序C表,生成D表;
printf("链表D中的数据为\n");
export(D); //输出D表;
printf("链表A中的数据为\n");
export(A); //输出A表;
printf("链表B中的数据为\n");
export(B); //输出B表;
printf("链表C中的数据为\n");
export(C); //输出C表;
printf("链表D中的数据为\n");
export(D); //输出D表;
return0;
}
- 实现两个链表的合并 实训(1)
- 实现两个有序链表的合并
- 实现两个有序链表的合并
- C++实现两个已经排序的链表进行合并
- C++实现两个已经排序的链表进行合并
- C++实现两个已经排序的链表进行合并
- 剑指offer:合并两个排序的链表 代码实现
- Java语言实现两个有序链表的合并
- Java实现两个有序链表的合并
- 合并两个排序的链表---递归实现
- 逆转交替合并两个链表的解析与实现
- 合并两个排序的链表(Java实现)
- 合并两个排序的链表java实现
- 合并两个线性表的实现
- 顺序表实现两个集合的合并
- 两个链表的合并
- 两个链表的合并
- 递归实现两个链表合并
- 为什么使用内部类
- 扩充BusyBox,追加Applet的方法
- Dialog自定义布局上面,控件实现动画
- C#利用ZedDemo组件生成数据报表
- eMule中的server无法连接问题
- 实现两个链表的合并 实训(1)
- linux 下查看分区情况
- iphone的自动旋转和自动调节大小
- 转载:提高firefox扩展开发效率
- 碎碎
- 猴子选大王 实训(2)
- 算术表达式求值 实训(3)
- 真机缺少com.google.android.maps.jar
- 员工工资管理(综合训练) (实训4)