已知单链表LA和LB的元素递增排列,合并LA和LB得到新的单链表LC,LC也是递增排列
目录
1.C代码
#include "stdio.h"
#include "stdlib.h"
typedef int DataType; //数据域类型
typedef struct node{ //节点的结构体
DataType data;
struct node *next;
}ListNode;
typedef struct
{
ListNode* head;
}LinkList;
void InitList(LinkList *L)
{
L->head=(ListNode *)malloc(sizeof(ListNode));
L->head->next=NULL;
}
int LengthList(LinkList *L)
{
int j=0;
ListNode *p;
p=L->head->next;
while(p)
{
p=p->next;
j++;
}
return j;
}
void ShowList(LinkList *L)
{
ListNode *p;
p=L->head->next;
if(p)
printf("\n单链表内容为:");
else
printf("\n单链表为空。");
while(p)
{
printf("%5d",p->data);
p=p->next;
}
printf("\n");
}
//L->head指向头节点,单链表为空的条件是L->head->next == NULL
//头插法
insert_head(LinkList *L)
{
int n,c,i;
ListNode *p; //新建一个节点
printf("please input a number n(insert_head):") ;
scanf("%d",&n) ;
for(i=0;i<n;i++)
{
p=(ListNode *)malloc(sizeof(ListNode));
scanf("%d",&c);
p->data = c;
p->next = L->head->next;
L->head->next = p;;
}
}
//尾插法
insert_rear(LinkList *L)
{
int n,c,i;
ListNode *p; //新建一个节点
ListNode *r; //尾指针
r=L->head; //尾指针指向头节点
printf("please input a number n(insert_rear):") ;
scanf("%d",&n) ;
for(i=0;i<n;i++)
{
p=(ListNode *)malloc(sizeof(ListNode));
scanf("%d",&c);
p->data = c;
p->next = NULL;
r->next = p;
r=p;
}
}
//有序链表的合并
void MergeList_L(LinkList *La,LinkList *Lb,LinkList *Lc)
{
//已知单链表LA和LB的元素递增排列
//归并LA和LB得到新的单链表LC,LC也是递增排列
ListNode *pa,*pb,*pc;
pa=La->head->next;
pb=Lb->head->next;
Lc->head = pc = La->head;
while(pa && pb)
{
if(pa->data<=pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else{
pc->next=pb;
pc=pb;
pb=pb->next;
}
pc->next=pa?pa:pb;
free(Lb->head);
}
}
int main()
{
LinkList L;
LinkList La; LinkList Lb; LinkList Lc;//建立链表
ListNode *p;//新建指针
DataType x;
int i,choice,n;
InitList(&L);
InitList(&La);InitList(&Lb);InitList(&Lc);//初始化
// insert_head(&L);
insert_rear(&La);
ShowList(&La);
insert_rear(&Lb);
ShowList(&Lb);
MergeList_L(&La,&Lb,&Lc);
ShowList(&Lc);
return 0;
}
2.运行结果演示