循環鏈表(Circular Linked List):是一種頭尾相接的鏈表。其特點是最後一個結點的指針域指向鏈表的頭結點,整個鏈表的指針域鏈接成一個環。 從循環鏈表的任意一個結點出發都可以找到鏈表中的其它結點,使得表處理更加方便靈活。
循環鏈表的操作
對於單循環鏈表,除鏈表的合並外,其它的操作和單線性鏈表基本上一致,僅僅需要在單線性鏈表操作算法基礎上作以下簡單修改:
⑴ 判斷是否是空鏈表: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為頭指針表示的一元多項式相加,生成一個新的結果多項式 */
{ ploy *Lc , *pc , *pa , *pb , *p ; float x ;
Lc=pc=(ploy *)malloc(sizeof(ploy)) ;
pa=La->next ; pb=Lb->next ;
while (pa!=NULL&&pb!=NULL)
{ if (pa->expn<pb->expn)
{ p=(ploy *)malloc(sizeof(ploy)) ;
p->coef=pa->coef ; p->expn=pa->expn ;
p->next=NULL ; /* 生成一個新的結果結點並賦值 */
pc->next=p ; pc=p ; pa=pa->next ;
} /* 生成的結點插入到結果鏈表的最後,pa指向下一個結點 */
if (pa->expn>pb->expn)
{ p=(ploy *)malloc(sizeof(ploy)) ;
p->coef=pb->coef ; p->expn=pb->expn ;
p->next=NULL ; /* 生成一個新的結果結點並賦值 */
pc->next=p ; pc=p ; pb=pb->next ;
} /* 生成的結點插入到結果鏈表的最後,pb指向下一個結點 */
if (pa->expn==pb->expn)
{ x=pa->coef+pb->coef ;
if (abs(x)<=1.0e-6) /* 系數和為0*/
{ pa=pa->next ; pb=pb->next ; } /*pa, pb分別直接後繼結點 */
else /* 系數和不為0,生成的結點插入到結果鏈表的最後, pa, pb分別直接後繼結點 */
{ p=(ploy *)malloc(sizeof(ploy)) ;
p->coef=x ; p->expn=pb->expn ;
p->next=NULL ; /* 生成一個新的結果結點並賦值 */
pc->next=p ; pc=p ;
pa=pa->next ; pb=pb->next ;
} } } /* end of while */
if (pb!=NULL)
while(pb!=NULL)
{ p=(ploy *)malloc(sizeof(ploy)) ;
p->coef=pb->coef ; p->expn=pb->expn ;
p->next=NULL ; /* 生成一個新的結果結點並賦值 */
pc->next=p ; pc=p ; pb=pb->next ;
}
if (pa!=NULL)
while(pa!=NULL)
{ p=(ploy *)malloc(sizeof(ploy)) ;
p->coef=pb->coef ; p->expn=pa->expn ;
p->next=NULL ; /* 生成一個新的結果結點並賦值 */
pc->next=p ; pc=p ; pa=pa->next ;
}
return (Lc) ;