将两个单链表归并成一个按元素值递减有序的单链表

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include
typedef struct LNode{
int num;
struct LNode *next;
}LNode,*linklist;
void Insertlist(linklist &L,int e) /*L为已知有序递增链表,在L的适当位置插入p,使得L保持有序性*/
{
linklist p1,q,p2;
p1=(linklist)malloc(sizeof(LNode));
p1->num=e;
if(L->next) /*判断链表L是否为空链表*/
{
q=L->next;/*将L第一个元素地址给q*/
p2=L;
while(q->next&&q->numnum)/*若q不是最后一个节点,且q的值小于p的值则q后移一位*/
{ p2=q;
q=q->next;
}
if(q->num>=p1->num) /*查找插入位置*/
{ p1->next=q;
p2->next=p1;
}
else
{ q->next=p1;
p1->next=NULL;
} /*插入节点*/
}
else
{ L->next=p1;
p1->next=NULL;
}
}

void createlist(linklist &L)/*创建带头结点的有序链表*/
{ int i,m,k;
L=(linklist)malloc(sizeof(LNode));
L->next=NULL;
printf("请输入链表的长度:");
scanf("%d",&m);
printf("请输入数据: "); /*建立一个带头节点单链表*/
for(i=0;i{ scanf("%d",&k); /*输入数据*/
Insertlist(L,k); /*调用插入函数,将新生成的节点插入链表中*/
}
printf("\n");
}
void turnback(linklist &L) /*链表的逆置*/
{
linklist p,q;
p=L->next; /*p指向第一个元素*/
L->next=NULL;
while(p)
{
q=p->next;
p->next=L->next;
L->next=p;
p=q;
}
}

void mergelist(linklist &L1,linklist L2) /*合并L1,L2两个链表,用的地址L1作为新链表地址返回*/
{ linklist p1,p2,p3,p4;
p1=L1->next;
p2=L2->next;
p3=L1;
while(p1&&p2)
{ if(p1->num<=p2->num) /*若p1的值小于或等于p2的值,则帕p1\p3同时后移*/
{ p3=p1;
p1=p1->next;
}
else /*若p1的值大于p2的值,则p1前插入p2,p2和p3后移*/
{ p4=p2->next;
p2->next=p1;
p3->next=p2;
p3=p2;
p2=p4;
}
}
p3->next=p1?p1:p2; /*插入剩余段*/
free(L2); /*释放L2的头节点*/
}
void printlist(linklist L) /*打印已知链表*/
{ linklist p;
p=L->next;
while(p)
{ printf("%5d",p->num); /*输出数据*/
p=p->next;
}
printf("\n");
}

void main(){
linklist L1,L2;
printf("创建有序链表L1\n");
createlist(L1);
printf("单链表L1为:");
printlist(L1);
printf("创建有序链表L2:\n");
createlist(L2);
printf("L2链表为:");
printlist(L2);
mergelist(L1,L2); //调用合并两个链表的函数
printf("合并两个单链表后新的链表为:\nnum score\n");
printlist(L1);
printf("递减排序:");
turnback(L1);
printlist(L1);
}

相关文档
最新文档