1. 循環(huán)鏈表
與單鏈表基本無異揉阎,但有如下兩點(diǎn)需要注意:
(1)最后一結(jié)點(diǎn)的指針域必須指向頭結(jié)點(diǎn)分俯,這樣才能循環(huán)
(注意懦铺,指向的是沒有存數(shù)據(jù)頭結(jié)點(diǎn)夹抗,而非第一個(gè)存有數(shù)據(jù)的結(jié)點(diǎn))
(2)使用尾指針而非頭指針表示鏈表躲株,這樣找尋頭結(jié)點(diǎn)和尾結(jié)點(diǎn)的時(shí)間復(fù)雜度為O(1)。
2. 雙鏈表定義
//結(jié)點(diǎn)定義娶眷,每個(gè)結(jié)點(diǎn)除了數(shù)據(jù)項(xiàng)還有前驅(qū)指針和后繼指針
typedef struct Node
{
elemType data;
Node *prior,*next;
};
typedef Node *List;
3. 創(chuàng)建雙鏈表
這里值得注意的是偎行,鏈表為空是,頭結(jié)點(diǎn)的前驅(qū)指針和后繼指針均指向它自己领虹。
因而在創(chuàng)建或插入結(jié)點(diǎn)的時(shí)候规哪,要記得把頭結(jié)點(diǎn)的前驅(qū)指針修改成最后一個(gè)結(jié)點(diǎn)。
4. 插入和刪除
插入:查找到插入位置塌衰,修改前驅(qū)結(jié)點(diǎn)和后繼結(jié)點(diǎn)的指針
bool insert(List &l,int i,elemType e)
{
Node *p,*q,*s;
int j;
p = l->next;
//找尋插入位置
for(j = 1;j<i && p;j++)
{
p = p->next;
}
s = (Node *)malloc(sizeof(Node));
s->data = e;
s->prior = p->prior;
s->next = p;
//修改前驅(qū)結(jié)點(diǎn)的后繼指針
p->prior->next = s;
//修改后繼結(jié)點(diǎn)的前驅(qū)指針
p->prior = s;
}
刪除:找到刪除結(jié)點(diǎn)诉稍,修改前驅(qū)結(jié)點(diǎn)的后繼指針,后繼結(jié)點(diǎn)的前驅(qū)指針
bool deleteNode(List &l,int i)
{
Node *p;
int j;
p = l->next;
for(j = 1;j<i;j++)
{
p = p->next;
}
//修改前驅(qū)結(jié)點(diǎn)的后繼指針
p->prior->next = p->next;
//修改后繼結(jié)點(diǎn)的前驅(qū)指針
p->next->prior = p->prior;
//釋放結(jié)點(diǎn)
free(p);
}