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 }

 

posted @ 2014-12-19 10:53  wonkju  阅读(830)  评论(0编辑  收藏  举报