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