【資料結構 C描述】有兩個整數集合 A 和 B 分別用兩個線性表 LA 和 LB 表示,求:一個新的集合A=A∪B,A仍然為純集合,線性表採用鏈式儲存方式。【單鏈表】
阿新 • • 發佈:2018-12-15
這是我的作業題,作業寫完後再附到部落格中,可能程式碼寫得很爛。雖然是C語言寫的,但是我在其中加入了C++的寫法,例如cout。我懶得寫printf的格式控制符,所以用cout來輸出內容,這樣我感覺簡便多了
題目
假設:有兩個整數集合 A 和 B 分別用兩個線性表 LA 和 LB 表示,即:線性表中的資料元素即為集合中的成員。(A/B為純集合) 要求:一個新的集合A=A∪B,A仍然為純集合,線性表採用鏈式儲存方式。
該實驗內容以“int”作為線性表資料元素的資料型別。
程式碼:
//main.cpp #include <iostream> #include "ListNode.h" using namespace std; int main() { ListNode *LA,*LB; InitList(LA); InitList(LB); int a[10] = { 1,2,3,4,5,6,7,8,9,10 }; int b[10] = { 34, 1, 9, 32, 12, 8, 99, 60, 3, 4}; //CreateListF(L, a, 10); cout << "集合A:"; CreateListR(LA, a, 10); //尾插法 DispList(LA); cout << "集合B:"; CreateListR(LB, b, 10); DispList(LB); cout << "集合A = A U B :"; /* *(1)根據題幹要求,可用兩個連結串列物件分別表示兩個集合; *(2)逐個取集合B的元素ei,與集合A中的每個元素進行比較,如果ei不在A中,則將ei插入到集合A中; */ int LB_Elem = 0; //表B的一個元素 int LA_Elem = 0; //表A的一個元素 for (int i = 1; i < ListLength(LB); i++) { //遍歷LB中的元素 GetElem(LB, i, LB_Elem); //獲取LB中的元素LB_Elem if (!isEqual(LA, i, LB_Elem)) //判斷LB_Elem是否與LA中的第i個元素相等 { ListInsert(LA, i, LB_Elem); //將LB中的元素插到LA中 } } /* *這個方法有問題 沒有與A中的每一個元素進行比較 只比較了第一個元素 * for (int i = 0; i < ListLength(LB); i++) {//遍歷LB中的元素 GetElem(LB, i, LB_Elem); //獲取LB中的元素LB_Elem for (int j = 0; j < ListLength(LA); j++) { //遍歷LA中的元素 GetElem(LA, j, LA_Elem); //獲取LA中的元素LA_Elem if (LB_Elem != LA_Elem) { //如果LB中的元素不等於LA中的元素 ListInsert(LA, j, LB_Elem); //將LB中的元素插到LA中 } } } */ DispList(LA); DestoryList(LA); DestoryList(LB); system("pause"); return 0; }
ListNode.h
//ListNode.h #include<iostream> #include<malloc.h> using namespace std; typedef int ElemType; typedef struct LNode { ElemType data; struct LNode *next; }ListNode; /* //頭插法 void CreateListF(ListNode *&L, ElemType a[], int n) { ListNode *s; L = (ListNode *)malloc(sizeof(ListNode)); L->next = NULL; for (int i = 0; i < n; i++) { s = (ListNode *)malloc(sizeof(ListNode)); s->data = a[i]; s->next = L->next; L->next = s; } } */ //尾插法 void CreateListR(ListNode *&L, ElemType a[], int n) { ListNode *r, *s; L = (ListNode *)malloc(sizeof(ListNode)); r = L; for (int i = 0; i < n; i++) { s = (ListNode*)malloc(sizeof(ListNode)); s->data = a[i]; r->next = s; r = s; } r->next = NULL; } void InitList(ListNode *&L) { L = (ListNode *)malloc(sizeof(ListNode)); L->next = NULL; } /* *過程:讓pre 和 p 指向相鄰的兩個節點(初始時pre指向頭節點,p指向首節點) *當p不為空時迴圈 *釋放節點pre,然後pre,p同步往後移一個結點 *迴圈結束後pre指向尾結點 *釋放掉pre */ void DestoryList(ListNode *&L) { ListNode *pre = L, *p = L->next; while (p != NULL) { free(pre); //釋放節點pre pre = p; //pre往後移一個結點 p = pre->next; //p同步往後移一個結點 } free(pre); } bool ListEmpty(ListNode *L) { return(L->next == NULL); } void DispList(ListNode *L) { ListNode *p = L->next; //p指向首節點 while (p != NULL) { cout << p->data << " "; //輸出p指向的資料域 p = p->next; //p指向下一個節點 } cout << "\n"; } int ListLength(ListNode *L) { int counter_Node = 0; //用來統計節點的個數 ListNode *p = L; //指標p指向頭節點L while (p != NULL) { counter_Node++; p = p->next; //p指向下一個節點 } return counter_Node; } bool GetElem(ListNode *L, int i, ElemType &e) { int counter_Node = 0; //用來統計遍歷過的節點的個數 ListNode *p = L; if (i <= 0 ) return false; //判斷要獲取的元素是否在範圍內 while (counter_Node < i && p != NULL) { counter_Node++; p = p->next; //p指向下一個節點 } if (p == NULL) return false; else { e = p->data; //把p指向的資料域給e return true; } } /* *在單鏈表L中從頭開始找第一個至於與e相等的節點,若存在,則返回邏輯序號, *否則返回0 */ int LocateElem(ListNode *L, ElemType e) { int i = 1; //用於表示首節點的序號 ListNode *p = L->next; //指標p指向首節點 while (p != NULL && p->data != e) { //當指標p不為空和p的資料域不為空的時候迴圈 p = p->next; //p指向下一個節點 i++; } if (p == NULL) return 0; else return i; } bool ListInsert(ListNode *&L, int i, ElemType e) { int j = 0; //用於表示頭結點的位置 ListNode *p = L, *s; if (i <= 0) return false; while (j < i - 1 && p != NULL) { j++; p = p->next; //p節點向後移一位 } if (p == NULL) return false; else { s = (ListNode *)malloc(sizeof(ListNode)); s->data = e; //把要插入的節點e的放到s指向的資料域裡 s->next = p->next; p->next = s; return true; } } bool ListDelete(ListNode *&L, int i, ElemType e) { int j = 0; //記錄頭節點 ListNode *p = L, *q; if (i <= 0) return false; while (j < i - 1 && p != NULL) { //查詢第i-1個節點 j++; p = p->next; } if (p == NULL) return false; else { q = p->next; //q指向第i個節點 if (q == NULL) { return false; } e = q->data; //將要刪除的資料放到e中,待作其他用途,例如輸出它 p->next = q->next; //p指標指向下下個節點 free(q); return true; } } /* *ListElem表示LA中的元素 *judgeElem表示獲取到LB中的元素 */ //判斷jugdeElem是否與表L中的每個ListElem元素相同 //相同返回true 否則返回false bool isEqual(ListNode *L, int ListElem, int judgeElem) { for (int i = 0; i < ListLength(L); i++) { GetElem(L, i, ListElem); if (judgeElem == ListElem) { return true; } } return false; }
執行截圖