靜態(tài)鏈表、循環(huán)鏈表、雙循環(huán)鏈表

靜態(tài)鏈表

用數(shù)組描述的鏈表叫做靜態(tài)鏈表;

數(shù)組的元素由兩部分組成, data和cur, data存儲(chǔ)數(shù)據(jù);cur存儲(chǔ)該元素的后繼在數(shù)組中的下標(biāo)(類似單鏈表中的next指針);
數(shù)據(jù)元素類似下面結(jié)構(gòu)體

typedef struct{
ElemType data; 
int cur;
} Componet,StaticLinkList[MAXSIZE];

備用鏈表

  • 數(shù)組中未使用的數(shù)組元素;
  • 數(shù)組的第一個(gè)元素,即下標(biāo)為0的元素的cur就存放備用鏈表的第一個(gè)結(jié)點(diǎn)下標(biāo),而數(shù)組的最后一個(gè)元素的cur 則存放第一個(gè)有數(shù)值的元素的下標(biāo),相當(dāng)于單鏈表中的頭結(jié)點(diǎn)的作用,當(dāng)鏈表為空時(shí),為0;

靜態(tài)鏈表的插入操作

如下圖所示;


初始鏈表
初始鏈表

插入操作
插入操作

將丙插入乙和丁之間;

  • 將元素丙添加到備用鏈表;
  • 將乙的cur 改為 丙的游標(biāo);
  • 將丙的cur 改為 丁的游標(biāo);

靜態(tài)鏈表的優(yōu)缺點(diǎn);

1、優(yōu)點(diǎn)

  • 在插入和刪除操作時(shí),只需要修改游標(biāo),不需要移動(dòng)元素,從而改進(jìn)了在順序存儲(chǔ)結(jié)構(gòu)中的插入和刪除操作需要移動(dòng)大量元素的缺點(diǎn);

2、缺點(diǎn)

  • 沒有解決連續(xù)存儲(chǔ)分配帶來的表長難以確定的問題;
  • 失去了順序存儲(chǔ)結(jié)構(gòu)隨機(jī)存取的特性;

循環(huán)鏈表

將單鏈表中終端結(jié)點(diǎn)的指針端由空指針改為指向頭結(jié)點(diǎn),就使整個(gè)單鏈表形成一個(gè)環(huán),這種頭尾相接的單鏈表稱為單循環(huán)鏈表;簡稱循環(huán)鏈表;

  • 尾指針: rear;
  • 開始結(jié)點(diǎn): rear->next->next;

雙向鏈表

在單向鏈表的每個(gè)鏈表結(jié)點(diǎn)中

每一個(gè)鏈表元素結(jié)構(gòu)類似下面

typedef struct{
ElemType data;
struct DuLNode *prior   /* 直接前驅(qū)指針*/;
struct DuLNode  *next;  /*直接后驅(qū)指針 */
}DuLNode, *DuLinkList
非空的循環(huán)帶頭結(jié)點(diǎn)的雙向鏈表
非空的循環(huán)帶頭結(jié)點(diǎn)的雙向鏈表

雙向鏈表的插入操作

假設(shè)存儲(chǔ)元素e的結(jié)點(diǎn)為s,要實(shí)現(xiàn)將結(jié)點(diǎn)s插入到結(jié)點(diǎn)p與p->next之間;
算法思路:

s->prior = p;  /*把p賦值給s的前驅(qū)*/
s->next = p->next; /*把p->next賦值給s->next*/
p->next->prior = s; /*將s賦值給p->next的前驅(qū)*/
p->next = s; /*將s賦值給p->next*/

雙向鏈表的刪除操作

p->prior->next = p->next;   /*把p->next 賦值給p->prior的后繼*/
p->next->prior = p->prior;  /*把p->prior賦值給p->next 的前驅(qū)*/
free(p);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容