資料結構--順序表和單鏈表c++
阿新 • • 發佈:2020-11-13
順序表
#include <iostream> using namespace std; constexpr auto MAXSIZE = 100; constexpr auto ERROR = 0; constexpr auto OK = 1; typedef int ElemType; //順序表的儲存結構 typedef struct { ElemType* elem; int length; }SqList; //構造一個空的順序表 int InitList(SqList &L) { //申請MAXSIZE個ElemType型變數空間,整型指標L.elem指向該地址空間開始處 L.elem = new ElemType[MAXSIZE]; if (!L.elem) exit(OVERFLOW); L.length = 0; return OK; } //取值--通過e返回第i個元素的傳值 int GetElem(SqList L, int i, ElemType& e) { if (i<1 || i>L.length) return ERROR; //判斷i值是否合理 e = L.elem[i - 1]; //elem[i-1]單元儲存第i個數據元素 return OK; } //查詢--在順序表L中查詢值為e的資料元素,返回其序號 int LocateElem(SqList L, ElemType e) { for (int i = 0; i < L.length; i++) { if (L.elem[i] == e) return i + 1; //查詢成功,返回序號i+1 } return 0; //查詢失敗,返回0 } //插入--在順序表L中第i個位置插入新的元素e,i值的合法範圍是1<=i<=L.length+1 int ListInsert(SqList& L, int i, ElemType e) { if ((i < 1) || (i > L.length + 1)) return ERROR; //i值不合法 if (L.length == MAXSIZE) return ERROR; //當前儲存空間已滿 for (int j = L.length - 1; j >= i; j--) L.elem[j + 1] = L.elem[j]; L.elem[i - 1] = e; ++L.length; return OK; } //刪除--在順序表刪除第i個元素,i值的合法範圍是1<=i<=i.length int ListDelete(SqList& L, int i) { if ((i < 1) || (i > L.length)) return ERROR; for (int j = 0; j <= L.length - 1; j++) L.elem[j - 1] = L.elem[j]; --L.length; return OK; } int main() { SqList L; ElemType e; int i; //順序表的初始化方法測試 if (InitList(L) == 1) { cout << "順序表初始化成功" << endl; cout << "當前順序表長度: " << L.length << endl; } //為方便測試其他方法,將順序表L初始化賦值一些資料 int num[] = { 12,13,21,24,28,30,42,77 }; for (int n = 0; n < sizeof(num) / sizeof(num[0]); n++) { L.elem[n] = num[n]; L.length++; } cout << "賦值完成,當前順序表長度: " << L.length << endl; //測試順序表的取值--返回第3個元素的值到e if (GetElem(L, 3, e)) cout << "第3個元素的值是: " << e << endl; //測試順序表的查詢--查詢元素24的位置並返回 if (int index = LocateElem(L, 24)) { cout << "24的序號是: " << index << endl; } else cout << "元素查詢失敗!" << endl; //測試順序表的插入--在第5個位置插入25 if (ListInsert(L, 5, 25)) cout << "插入後第5個位置為: " << L.elem[4] << endl; //測試順序表的刪除--刪除第4個元素 if (ListDelete(L, 4)) cout << "刪除成功!" << endl; }
單鏈表
#include <iostream> using namespace std; constexpr auto ERROR = 0; constexpr auto OK = 1; typedef int ElemType; //單鏈表的儲存結構 typedef struct LNode { ElemType data; struct LNode* next; //結點的指標域 }LNode, * LinkList; //LinkList為指向結構體LNode的指標型別 //構造一個空的單鏈表L int InitList(LinkList& L) { L = new LNode; //生成新的結點為頭結點,用頭指標L指向頭結點 L->next = NULL; //頭結點指標域為空 return OK; } //建立單鏈表--(前插法)逆位序輸入n個元素的值,建立帶表頭結點的單鏈表 void CreateList_H(LinkList& L, int n) { L = new LNode; L->next = NULL; //建立一個帶有頭結點的單鏈表 LinkList p; for (int i = n; i > 0; i--) { p = new LNode; cin >> p->data; p->next = L->next; L->next = p; } } //建立單鏈表--(後插法)正位序輸入n個元素的值,建立帶表頭結點的單鏈表 void CreateList_R(LinkList& L, int n) { L = new LNode; L->next = NULL; //建立一個帶有頭結點的單鏈表 LinkList r = L; //尾指標r指向頭結點 LinkList p; for (int i = 0; i < n; ++i) { p = new LNode; cin >> p->data; p->next = NULL; r->next = p; //r=上一個,所以將上一個結點next指向新建的p r = p; //r指向新的尾結點*p } } //插入--在帶有頭結點的單鏈表L中第i個位置插入值為e的新節點 int ListInsert(LinkList& L, int i, int e) { LinkList p = L; int j = 0; //查詢第i-1個結點,指向該結點 while (p && j < i - 1) { p = p->next; j++; } if (p == NULL || j < i - 1) return ERROR;//檢查插入位置是否合法 LinkList s; s = new LNode; s->data = e; s->next = p->next; p->next = s; return OK; } //刪除位置i上的元素,並由e返回刪除的元素 int ListDelete(LinkList& L, int i) { LinkList p = L, q; int j = 0; while (p->next && i - 1 > j) {//查詢第i-1個結點,指向該結點 p = p->next; j++; } if (!(p->next) || j > i - 1) return ERROR; //刪除位置不合法 q = p->next; p->next = q->next; //改變刪除結點前驅結點的指標域 delete q; //釋放空間q return OK; } //取值--在帶有頭結點的單鏈表L中根據序號i通過e返回第i個數據 int GetElem(LinkList L, int i, ElemType& e) { LinkList p; p = L->next; int j = 1; while (p && j < i) { p = p->next; j++; } if (!p || j > i) return ERROR; e = p->data; return OK; } //查詢--在帶有頭結點的單鏈表L中查詢值為e的元素 LNode* LocateElem(LinkList L, ElemType e) { LinkList p = L->next; //初始化p指向首元結點 while (p != NULL && p->data != e) { p = p->next; } return p; //查詢成功返回為e的結點地址p,失敗則p為NULL } //方便測試輸入單鏈表 void printLinklist(LinkList L) { LinkList p; p = L->next; while (p != NULL) { cout << p->data << " "; p = p->next; } } int main() { LinkList L; CreateList_H(L, 3);//建立一個長度為3的單鏈表 printLinklist(L); cout << endl; ListInsert(L, 2, 8);//向第二個位置插入8 printLinklist(L); cout << endl; ListDelete(L, 1);//刪除第一個位置的元素 printLinklist(L); cout << endl; ElemType e; GetElem(L, 2, e); cout << e << endl; cout << LocateElem(L, 12); return 0; }