1 雙鏈表
雙鏈表結(jié)點(diǎn)中有兩個(gè)指針prior和next华匾,分別指向其前驅(qū)結(jié)點(diǎn)和后繼節(jié)點(diǎn)映琳。
雙鏈表中結(jié)點(diǎn)類型的描述如下:
typedef int ElemType;
typedef struct DNode {
ElemType data;
struct Dnode *prior, *next;
} DNode, *DLinkList;
1)雙鏈表的插入操作
在雙鏈表中p所指的結(jié)點(diǎn)之后插入結(jié)點(diǎn)s机隙。
①s->next = p->next;
②p->next->prior = s;
③s->prior= p;
④p->next = s;
上述代碼語句順序不是唯一的,但也不是任意的萨西,①②兩步必須在④之前有鹿,否則p的后繼結(jié)點(diǎn)的指針就丟掉了。
2)雙鏈表的刪除操作
刪除雙鏈表中結(jié)點(diǎn)p的后繼結(jié)點(diǎn)q谎脯。
p->next = q->next;
q->next->prior= p;
free(q);
2 循環(huán)鏈表
1.循環(huán)單鏈表
循環(huán)單鏈表和單鏈表的區(qū)別在于葱跋,表中最后一個(gè)結(jié)點(diǎn)的指針不是NULL,而改為指向頭結(jié)點(diǎn)源梭,從而整個(gè)鏈表形成一個(gè)環(huán)娱俺。
在循環(huán)單鏈表中,表尾結(jié)點(diǎn)r的next域指向L废麻,故表中沒有指針域?yàn)镹ULL的結(jié)點(diǎn)荠卷,因此循環(huán)單鏈表的判空條件不是頭結(jié)點(diǎn)的指針是否為空,而是它是否等于頭指針烛愧。
2.循環(huán)雙鏈表
在循環(huán)雙鏈表中油宜,頭結(jié)點(diǎn)的prior指針還要指向表尾結(jié)點(diǎn)。
在循環(huán)雙鏈表L中怜姿,某結(jié)點(diǎn)p為尾結(jié)點(diǎn)時(shí)慎冤,p->next = L;當(dāng)循環(huán)雙鏈表為空表時(shí)沧卢,其頭結(jié)點(diǎn)的prior域和next域都等于L蚁堤。
3 靜態(tài)鏈表
靜態(tài)鏈表是借助數(shù)組來描述線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),結(jié)點(diǎn)也有數(shù)據(jù)域data和指針域next但狭,與前面所講的鏈表中的指針不同的是违寿,這里的指針是結(jié)點(diǎn)的相對(duì)地址(數(shù)組下標(biāo)),又稱為游標(biāo)熟空。和順序表一樣藤巢,靜態(tài)鏈表也要預(yù)先分配一塊連續(xù)的內(nèi)存空間。
靜態(tài)鏈表結(jié)構(gòu)類型的描述如下:
#define MAXSIZE 100
typedef int ElemType;
typedef struct {
ElemType data; //存儲(chǔ)數(shù)據(jù)元素
int next; //下一個(gè)元素的數(shù)組下標(biāo)
} SLinkList[MAXSIZE];
靜態(tài)鏈表以next = -1作為其結(jié)束的標(biāo)志息罗。靜態(tài)鏈表的插入掂咒、刪除操作與動(dòng)態(tài)鏈表相同,只需要修改指針迈喉,而不需要移動(dòng)元素绍刮。總體來說挨摸,靜態(tài)鏈表沒有單鏈表使用起來方便孩革,但是在一些不支持指針的高級(jí)語言中,這又是一種非常巧妙的設(shè)計(jì)方法得运。