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

    技术2022-05-11  52

           最近通过对数据结构的学习,对链表有了更深的认识.在单向链表中,关键是确定下一结点的指针.现在通过一题目详细说明(在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


    最新回复(0)