從迴圈鍊錶的任意乙個結點出發都可以找到鍊錶中的其它結點,使得表處理更加方便靈活。迴圈鍊錶的操作
對於單迴圈鍊錶,除鍊錶的合併外,其它的操作和單線性鍊錶基本上一致,僅僅需要在單線性鍊錶操作演算法基礎上作以下簡單修改:
⑴ 判斷是否是空鍊錶:head->next==head ;
⑵ 判斷是否是表尾結點:p->next==head ;
雙向鍊錶(double linked list) :指的是構成鍊錶的每個結點中設立兩個指標域:乙個指向其直接前趨的指標域prior,
乙個指向其直接後繼的指標域next。
這樣形成的鍊錶中有兩個方向不同的鏈,故稱為雙向鍊錶。
和單鏈表類似,雙向鍊錶一般增加頭指標也能使雙鏈表上的某些運算變得方便。
將頭結點和尾結點鏈結起來也能構成迴圈鍊錶,並稱之為雙向迴圈鍊錶。
雙向鍊錶是為了克服單鏈表的單向性的缺陷而引入的
雙向鍊錶結構具有對稱性,設p指向雙向鍊錶中的某一結點,則其對稱性可用下式描述:
(p->prior)->next = p = (p->next)->prior ;
結點p的儲存位置存放在其直接前趨結點p->prior的直接後繼指標域中,同時也存放在其直接後繼結點p->next的直接前趨指標域中。① 若插入時僅僅標記出直接前驅結點,鉤鏈時必須注意先後次序是: 「先右後左」 。部分語句組如下:
s =(dulnode *)malloc(sizeof(dulnode));
s ->data=e;
s ->next=p->next; p->next->prior=s;
p->next= s; s ->prior=p; /* 鉤鏈次序非常重要 */
② 插入時同時指出直接前驅結點p和直接後繼結點q,鉤鏈時無須注意先後次序。部分語句組如下:
s=(dulnode *)malloc(sizeof(dulnode));
s ->data=e;
p->next= s; s ->next=q;
s ->prior=p; q->prior= s;雙向鍊錶的結點刪除
設要刪除的結點為p ,刪除時可以不引入新的輔助指標變數,可以直接先斷鏈,再釋放結點。部分語句組如下:
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);注意:
與單鏈表的插入和刪除操作不同的是,在雙向鍊錶中插入和刪除必須同時修改兩個方向上的指標域的指向
對兩個多項式鍊錶進行相加,生成乙個新的鍊錶存放相加後的結果,原來兩個多項式鍊錶依然存在,不發生任何改變,如果要再對原來兩個多項式進行其它操作也不影響。
演算法描述
ploy *add_ploy(ploy *la, ploy *lb)
/* 將以la ,lb為頭指標表示的一元多項式相加,生成乙個新的結果多項式 */
/* 生成的結點插入到結果鍊錶的最後,pa指向下乙個結點 */
if (pa->expn>pb->expn)
/* 生成的結點插入到結果鍊錶的最後,pb指向下乙個結點 */
if (pa->expn==pb->expn)
/*pa, pb分別直接後繼結點 */
else /* 係數和不為0,生成的結點插入到結果鍊錶的最後, pa, pb分別直接後繼結點 */
} } /* end of while */
if (pb!=null)
while(pb!=null)
if (pa!=null)
while(pa!=null)
return (lc) ;
資料結構 雙向列表與迴圈列表
從迴圈鍊錶的任意乙個結點出發都可以找到鍊錶中的其它結點,使得表處理更加方便靈活。迴圈鍊錶的操作 對於單迴圈鍊錶,除鍊錶的合併外,其它的操作和單線性鍊錶基本上一致,僅僅需要在單線性鍊錶操作演算法基礎上作以下簡單修改 判斷是否是空鍊錶 head next head 判斷是否是表尾結點 p next he...
核心list雙向迴圈列表
雙向迴圈鍊錶節點.結構體定義如下 1 list head定義並初始化 define list head init name define list head name struct list head name list head init name 所以list head name 等價於 str...
c實現雙向迴圈列表
linklist2.c linklist 雙向迴圈鍊錶 include include define maxsize 100 define elemtype int elemtype a maxsize int n typedef struct node dnode,dlinklist dlinkl...