c-连接两个链表

概述

  还是相对简单,不过要记得释放不用的头结点即可.

代码为:

 1 //将lList2头结点连接在lList1尾结点的后面.

 2 void

 3 combine(linklist lList1, linklist lList2) {

 4     Linknode *lst01Tail = lList1;    //最终指向lList1的尾结点.

 5     Linknode *tmp;    //临时指向lList2的头结点,用于释放lList2表的头结点.

 6     while (lst01Tail->next) {

 7         lst01Tail = lst01Tail->next;

 8     }

 9     

10     tmp = lList2;

11     lst01Tail->next = lList2->next;    //lList1的尾结点连接lList2的首节点.

12     //释放释放lList2表的头结点.

13     free(tmp);

14     tmp = NULL;

15     lList1->data += lList2->data;    //修改链表的长度.

16 }

完整代码:

 1 #include <stdio.h>

 2 #include <malloc.h>

 3 

 4 #define FALSE 0

 5 #define TRUE 1

 6 

 7 typedef struct node {

 8     int data;

 9     struct node *next;

10 } Linknode;

11 

12 typedef Linknode *linklist;

13 

14 //根据指定结点的个数,初始化一个带有头结点的单链表.

15 linklist

16 init(int n) {

17     linklist lList = (linklist)malloc(sizeof(struct node));    //头结点.

18     lList->next = NULL;    //初始时链表为空.

19     lList->data = n;    //头结点存储总元素个数.

20     if(!lList) {

21         printf("out of memory!\n");

22         return FALSE;

23     }

24     int i;

25     Linknode *tail = lList;

26     for(i = 0; i < n; i++) {

27         Linknode * nNew = (Linknode *)malloc(sizeof(struct node));

28         if(!nNew) {

29             printf("out of memory!\n");

30             return FALSE;

31         }

32         nNew->data = i + 1;    //为新结点赋值.

33         //重新指定尾结点.

34         tail->next = nNew;

35         tail = nNew;

36         nNew->next = NULL;

37     }

38     return lList;

39 }

40 

41 //遍历单链表所有结点.

42 void

43 traverse(linklist lList) {

44     Linknode *node;

45     node = lList->next;    //开始时指向第一个结点.

46     while(node) {

47         printf("%d ", node->data);

48         node = node->next;

49     }

50     printf("\n");

51     return;

52 }

53 

54 //将lList2头结点连接在lList1尾结点的后面.

55 void

56 combine(linklist lList1, linklist lList2) {

57     Linknode *lst01Tail = lList1;    //最终指向lList1的尾结点.

58     Linknode *tmp;    //临时指向lList2的头结点,用于释放lList2表的头结点.

59     while (lst01Tail->next) {

60         lst01Tail = lst01Tail->next;

61     }

62     

63     tmp = lList2;

64     lst01Tail->next = lList2->next;    //lList1的尾结点连接lList2的首节点.

65     //释放释放lList2表的头结点.

66     free(tmp);

67     tmp = NULL;

68     lList1->data += lList2->data;    //修改链表的长度.

69 }

70 

71 int

72 main(void) {

73     int n = 3;

74     linklist lList = init(n);

75     linklist lList2 = init(n);

76     traverse(lList);

77     combine(lList, lList2);

78     traverse(lList);

79     printf("\n");

80 }

 

你可能感兴趣的:(链表)