有序链表的合并(链式有序表的合并)

已知单链表LA和LB的元素递增排列,合并LA和LB得到新的单链表LC,LC也是递增排列

目录

1.C代码 

 2.运行结果演示


 

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.运行结果演示

 

 

 

 

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值