線性表的類型定義
-
線性結構的特點
- 存在唯一的一個被稱作"第一個"的數據元素
- 存在唯一的一個被稱作”最後一個“的元素
- 除第一個元素外,集合中的每個數據元素均只有一個前驅
- 除最後一個元素外,集合中的每個數據元素均只有一個後繼
-
線性表
是最常用且最簡單的一種數據結構。
在線性表中,一個數據元素可以由若干個數據項組成,把數據元素稱爲記錄,含有大量記錄的線性表又稱爲文件。 -
線性表的順序表示
指的是用一組地址連續的存儲單元依次存儲線性表的數據元素。
假設線性表的每個元素需佔用個存儲單元,並以所佔的第一個單元的存儲地址作爲數據元素的存儲位置。則線性表中第個數據元素的存儲位置和第個數據元素的存儲位置LOC(a_i)之間滿足的關係爲
-
線性表的鏈式表示
用一組任意的存儲單元存儲線性表的數據元素,這裏的元素可以是連續的,也可以是不連續的。
對於一個元素來說,除了存儲本身的值,還需要存儲一個指向其後繼的結點的指針,即要有數據域和指針域;n個結點組成了一個鏈表。 -
靜態鏈表
利用一維數組來存儲鏈表
#define MaxSize 1000 typedef struct{ ElemType data; int cur; // 這裏多了個cur,爲指示器,來代替指針指示結點在數組中的相對位置。數組中的第0分量可以看成頭結點,其指針域指示鏈表的第一個結點。 }component,SLinkList[MaxSize];
-
循環鏈表
爲另一種形式的鏈式存儲結構。特點是表中最後一個結點的指針域指向頭結點,整個鏈表形成了一個環。
-
雙向鏈表
在雙向鏈表的指針域中有兩個指針,其中一個指向前驅,一個指向後繼。
代碼
- 一個帶頭結點的線性鏈表類型的定義
#define ElemType int #define Static bool typedef struct LNode{ //結點類型 ElemType data; // 數據域 struct LNode *next; //指針域,指向下一個結點 } *Link,*Position; typedef struct{ Link head,tail; // 分別指向線性表中的頭結點和最後一個結點 int len; // 線性表中的元素個數 }LinkList; //構造一個空的線性鏈表 Static InitList(LinkList &L) { Link p; p = (Link)malloc(sizeof(LNode)); // 生成頭結點 if(p) { L.head = p; L.tail = p; L.len = 0; p->next = NULL; return true; } else { return false; } } //分配由p指向的值爲e的結點,並返回true Status MakeNode(Link &p,ElemType e) { p = (Link)malloc(sizeof(LNode)); // 分配一塊空間 if(p) { p->data = e; // 數據域 return true; } else { return false; } } //釋放p指向的結點 void FreeNode(Link &p) { free(p); } //h指向L的一個結點,把h當做頭結點,將s所指結點插入在第一個結點之前 Status InsFirst(LinkList &L,Link h,Link s) { s->next = h->next; h->next = s; if(h == (L.tail)) { //如果h和鏈表的尾指針指向同一個結點 //說明,原來鏈表中沒有數據,這時候修改尾指針,讓尾指針指向第一個結點 L.tail = h->next; } L.len++; return true; } //返回鏈表中頭結點的位置 Position GetHead(LinkList L) { return L.head; } //已知p指向線性鏈表中的一個結點,用e更新p所指結點中數據元素的值 Status SetCurElem(Link p,ElemType e) { p->data = e; return true; } //已知p指向線性鏈表L中的一個結點,返回p所指結點的直接後繼的位置 Position NextPro(Link p) { return p->next; } //已知p指向線性鏈表中的一個結點,返回p所指結點中數據元素的值 ElemType GetCurElem(Link p) { return p->data; } //h指向L的一個結點,把h當做頭結點,刪除鏈表中的第一個結點並以q返回 Status DelFirst(LinkList &L,Link h,Link p)