用C语言合并两个按递增排序的链表

来源:互联网 发布:redis查询数据库命令 编辑:程序博客网 时间:2024/06/07 21:08

       最近通过对数据结构的学习,对链表有了更深的认识.在单向链表中,关键是确定下一结点的指针.现在通过一题目详细说明(在VC6.0,WINXP PRO SP2上调试通过)

题目要求:建立两个存放整数的链表,按递增的顺序输入数据.将两个链表合并成一个链表,新链表上中的数据仍然按照递增排序. 

程序如下:

#include <stdio.h>
#include <stdlib.h>

typedef struct intnumber
{
 int n;
 struct intnumber *next;
}INTNUM;

INTNUM *creat(int num)/*建立链表*/
{
 INTNUM *p1,*p2,*head;
 int i;
 p1 = (INTNUM *)malloc(sizeof(INTNUM));
 head = p1;
 p2 = p1;
 for(i = 0;i < num - 1;i++)
 {
  p1 = (INTNUM *)malloc(sizeof(INTNUM));
  p2 ->next = p1;
  p2 = p1;
 }
 p1 ->next = NULL;
 return head;
}

void input(INTNUM *head)/*输入链表数据*/
{
 INTNUM *p;
 p = head;
 while(p ->next != NULL)
 {
  scanf("%d",&(p ->n));
  p = p ->next;
 }
 scanf("%d",&(p ->n));
}

void output(INTNUM *head)/*输出链表数据*/
{
 INTNUM *p;
 p = head;
 while(p ->next != NULL)
 {
  printf("%d/t",p ->n);
  p = p ->next;
 }
 printf("%d/n",p ->n);
}


void main(void)
{
 INTNUM *pa,*pb,*pc,*heada,*headb,*headc;/*pc是指向新链表的指针*/
 int counta,countb;/*counta,countb是建立链表的结点数*/
 printf("请输入建立A链表的结点数:");
 scanf("%d",&counta);
 pa = creat(counta);
 heada = pa;
 printf("请按递增输入A链表结点上的数据:");
 input(heada);
 printf("打印A链表结点上的数据:/n");
 output(heada);

 printf("请输入建立B链表的结点数:");
 scanf("%d",&countb);
 pb = creat(countb);
 headb = pb;
 printf("请按递增输入B链表结点上的数据:");
 input(headb);
 printf("打印B链表结点上的数据:/n");
 output(headb);

 printf("将链表A和链表B仍然按照递增关系合并成一个新的链表C:");
 headc = heada;
 pc = pa;
 pa = pa ->next;
 while(pa && pb)
 {
  if(pa ->n <= pb ->n)
  {
   pc ->next = pa;
   pc = pc ->next;
   pa = pa ->next;
  }
  else
  {
   pc ->next = pb;
   pc = pc ->next;
   pb = pb ->next;
  }
 }

 pc ->next = pa ? pa : pb;
 printf("打印合并后链表结点上的数据:/n");
 output(headc);  
}

结果如下:

请输入建立A链表的结点数:3
请按递增输入A链表结点上的数据:1 20 30
打印A链表结点上的数据:
1       20      30
请输入建立B链表的结点数:5
请按递增输入B链表结点上的数据:2 18 22 26 32
打印B链表结点上的数据:
2       18      22      26      32
将链表A和链表B仍然按照递增关系合并成一个新的链表C:打印合并后链表结点上的数据:
1       2       18      20      22      26      30      32

原创粉丝点击