數據結構 C描述】有兩個整數集合 A 和 B 分別用兩個線性表 LA 和 LB 表示(LA, LB遞增有序狀況下),求:一個新的集合C=A∪B,C仍然爲純集合,線性表採用鏈式存儲方式。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 /**  5  * 【數據結構 C描述】有兩個整數集合 A 和 B 分別用兩個線性表 LA 和 LB 表示,  6  * 求:一個新的集合C=A∪B,C仍然爲純集合,線性表採用鏈式存儲方式。  7  * 注:本算法中LA, LB爲遞增有序狀況,無序的話能夠考慮暴力  8  * 此狀況下複雜度爲o(m+n), m, n分別爲LA, LB長度  9 **/
 10 typedef struct node  11 {  12     int data;  13     struct node *next;  14 } LinkNode;  15 
 16 // 初始化鏈表
 17 void init_list(LinkNode *&list)  18 {  19     list = (LinkNode *)malloc(sizeof(LinkNode));  20     list->next = NULL;  21 }  22 
 23 /**  24  * 鏈表中插入數據(尾插法)  25  * int sz[]爲插入數據暫存數組, int len爲數據個數  26  */
 27 void create_list(LinkNode *list, int sz[], int len)  28 {  29     LinkNode *p = list, *temp = NULL;  30     for (int i = 0; i < len; i++)  31  {  32         temp = (LinkNode *)malloc(sizeof(LinkNode));  33         temp->data = sz[i];  34         p->next = temp;  35         p = p->next;  36  }  37     p->next = NULL;  38 }  39 
 40 // 將兩集合LA, LB合併爲LC返回, LA,LB中元素遞增有序(忽略free()操做)
 41 LinkNode *list_union_list(LinkNode *LA, LinkNode *LB)  42 {  43     LinkNode *LC = NULL, *temp = NULL, *p = LA->next, *q = LB->next, *r;  44  init_list(LC);  45     r = LC;  46     while (p && q)  47  {  48         if (p->data < q->data)  49  {  50             temp = (LinkNode *)malloc(sizeof(LinkNode));  51             temp->data = p->data;  52             r->next = temp;  53             p = p->next;  54             r = r->next;  55  }  56         else if (p->data > q->data)  57  {  58             temp = (LinkNode *)malloc(sizeof(LinkNode));  59             temp->data = q->data;  60             r->next = temp;  61             q = q->next;  62             r = r->next;  63  }  64         else
 65  {  66             temp = (LinkNode *)malloc(sizeof(LinkNode));  67             temp->data = p->data;  68             r->next = temp;  69             p = p->next;  70             q = q->next;  71             r = r->next;  72  }  73  }  74     if (p) // 若p非空,即LA未遍歷完,賦值給q
 75         q = p;  76     while (q) // 遍歷q,加到LC末尾
 77  {  78         temp = (LinkNode *)malloc(sizeof(LinkNode));  79         temp->data = q->data;  80         r->next = temp;  81         q = q->next;  82         r = r->next;  83  }  84     r->next = NULL;  85     return LC;  86 }  87 
 88 // 主函數
 89 int main()  90 {  91     LinkNode *LA = NULL, *LB = NULL, *LC = NULL, *p = NULL;  92     // 初始化
 93  init_list(LA);  94  init_list(LB);  95     // 聲明構造LA, LB鏈表的數組
 96     int la[] = {1, 8, 11, 13, 19, 21, 55, 100, 101, 200};  97     int lb[] = {5, 8, 15, 26, 33, 69, 99, 100, 150, 200, 700, 999, 1024, 2048, 3333};  98     // 構造LA, LB鏈表
 99     create_list(LA, la, 10); 100     create_list(LB, lb, 15); 101     // 求取交集
102     LC = list_union_list(LA, LB); 103     p = LC->next; 104     while (p) // 遍歷集合LC輸出結果
105         printf("%d ", p->data), p = p->next; 106     return 0; 107 }
相關文章
相關標籤/搜索