1. 程式人生 > 其它 >資料結構2.3線性表的鏈式表示和實現

資料結構2.3線性表的鏈式表示和實現

  1 #include<iostream>
  2 #include<string>
  3 using namespace std;
  4 
  5 typedef int Status;    //將status狀態設定為int
  6 typedef int ElemType;//ElemType狀態設定為int
  7 
  8 #define LIST_INIT_SIZE 100 //線性表儲存空間的初始分配量
  9 #define LISTINCREMENT 10    //線性表儲存空間的分配增量
 10 
 11 #define OK 1
 12 #define ERROR 0
 13
14 /*--------線性表的單鏈表儲存結構--------*/ 15 typedef struct LNode { 16 ElemType data; 17 struct LNode* next; 18 }LNode, *LinkList; 19 20 /*--------取出連結串列指定位置的資料--------*/ 21 Status GetElem(LinkList L, int i, ElemType& e) { 22 //L為帶頭結點的單鏈表頭指標 23 //當第i個元素存在時,其值賦值給e 24 25 LNode* p = L->next;
26 int j = 1; //初始化,p指向第一個節點,j為計數器 27 28 while (p && j < i) { 29 p = p->next; 30 ++j; 31 } 32 33 if (!p || j > i) return ERROR; //如果第i個元素不存在,返回ERROR 34 e = p->data; //第i個元素的值賦值給e 35 return OK; 36 }//GetElem 37 38 /*--------單鏈表插入--------
*/ 39 Status ListInsert_L(LinkList& L, int i, ElemType e) { 40 //在帶頭結點的單鏈表L中第i個位置之前插入元素e 41 LNode* p = L; //p指向頭指標 42 int j = 0; //j用來計數 43 while (p && j < i - 1) { 44 p = p->next; 45 ++j; 46 } 47 if (!p || j > i - 1) 48 return ERROR; 49 LinkList s = (LinkList)malloc(sizeof(LNode)); 50 s->data = e; 51 s->next = p->next; 52 p->next = s; 53 return OK; 54 }//ListInsert_L 55 56 Status ListDelete_L(LinkList& L, int i, ElemType& e) { 57 //在帶頭結點的L連結串列中刪除第i個元素 58 LinkList p = L; //先獲得頭結點 59 int j = 0; //用來 定位 60 while (p->next && j < i - 1) { 61 p = p->next; 62 j++; 63 } 64 if (!p->next || j > i - 1) { 65 return ERROR; //刪除位置不合適 66 } 67 LinkList q = p->next; 68 e = p->data; 69 p->next = q->next; 70 free(q); 71 return OK; 72 }//ListDelete_L 73 74 void CreateList_L(LinkList& L, int n) { 75 //逆位序輸入n個元素的值,建立帶頭結點的單鏈線性表L 76 L = (LinkList)malloc(sizeof(LNode)); 77 L->next = NULL; 78 for (int i = n; i > 0; --i) { 79 LinkList p = (LinkList)malloc(sizeof(LNode)); 80 cin >> p->data; 81 p->next = L->next; //第一個插入的p->next為null 82 L->next = p; 83 } 84 } 85 86 void MergeList_L(LinkList& La, LinkList& Lb, LinkList& Lc) { 87 //已知La Lb的元素按值非遞減排列 88 //並歸La和Lb得到新的連結串列lc,lc的元素也按值非遞減排列 89 LinkList p1 = La->next; 90 LinkList p2 = Lb->next; //取La Lb兩個連結串列的第一個節點 91 LinkList p3 = Lc = La; //用La的頭結點做Lc連結串列的頭結點 92 while (p1->next && p2->next) { 93 if (p1->data <= p2->data) { 94 p3->next = p1; 95 p3 = p1; 96 p1 = p1->next; 97 } 98 else { 99 p3->next = p2; 100 p3 = p2; 101 p2 = p2->next; 102 } 103 } 104 //插入剩餘段 105 p3->next = p1 ? p1 : p2; 106 } 107 108 int main() { 109 110 }