C實現迴圈鍊錶及雙向鍊錶

2021-05-03 21:48:05 字數 3203 閱讀 5074

在雙向鍊錶中,結點除含有資料域外,還有兩個鏈域,乙個儲存直接後繼結點位址,一般稱之為右鏈域;乙個儲存直接前驅結點位址,一般稱之為左鏈域。

鍊錶的c語言實現之迴圈鍊錶及雙向鍊錶

一、迴圈鍊錶

迴圈鍊錶是與單鏈表一樣,是一種鏈式的儲存結構,所不同的是,迴圈鍊錶的最後乙個結點的指標是指向該迴圈鍊錶的第乙個結點或者表頭結點,從而構成乙個環形的鏈。

迴圈鍊錶的運算與單鏈表的運算基本一致。所不同的有以下幾點:

1、在建立乙個迴圈鍊錶時,必須使其最後乙個結點的指標指向表頭結點,而不是象單鏈表那樣置為null。此種情況還使用於在最後乙個結點後插入乙個新的結點。

2、在判斷是否到表尾時,是判斷該結點鏈域的值是否是表頭結點,當鏈域值等於表頭指標時,說明已到表尾。而非象單鏈表那樣判斷鏈域值是否為null。

二、雙向鍊錶

雙向鍊錶其實是單鏈表的改進。

當我們對單鏈表進行操作時,有時你要對某個結點的直接前驅進行操作時,又必須從表頭開始查詢。這是由單鏈表結點的結構所限制的。因為單鏈表每個結點只有乙個儲存直接後繼結點位址的鏈域,那麼能不能定義乙個既有儲存直接後繼結點位址的鏈域,又有儲存直接前驅結點位址的鏈域的這樣乙個雙鏈域結點結構呢?這就是雙向鍊錶。

typedefstructnode

jd;

當然,也可以把乙個雙向鍊錶構建成乙個雙向迴圈鍊錶。

雙向鍊錶與單向鍊錶一樣,也有三種基本運算:查詢、插入和刪除。

雙向鍊錶的基本運算:

1、查詢

假若我們要在乙個帶表頭的雙向迴圈鍊錶中查詢資料域為一特定值的某個結點時,我們同樣從表頭結點往後依次比較各結點資料域的值,若正是該特定值,則返回指向結點的指標,否則繼續往後查,直到表尾。

下例就是應用雙向迴圈鍊錶查詢演算法的乙個程式。

#include<stdio.h>

#include<malloc.h>

#definen10

typedefstructnode

stud;

stud*creat(intn)

h->name[0]=』』;

h->llink=null;

h->rlink=null;

p=h;

for(i=0;i<n;i++)

p->rlink=s;

printf("請輸入第%d個人的姓名",i+1);

scanf("%s",s->name);

s->llink=p;

s->rlink=null;

p=s;

}h->llink=s;

p->rlink=h;

return(h);

}stud*search(stud*h,char*x)

printf("沒有查詢到該資料!");

}voidprint(stud*h)

printf("n");

}main()

2、插入

對於雙向迴圈鍊錶,我們現在可以隨意地在某已知結點p前或者p後插入乙個新的結點。

假若s,p,q是連續三個結點的指標,若我們要在p前插入乙個新結點r,則只需把s的右鏈域指標指向r,r的左鏈域指標指向s,r的右鏈域指標指向p,p的左鏈域指標指向r即可。

在p,q之間插入原理也一樣。

下面就是乙個應用雙向迴圈鍊錶插入演算法的例子:

#include<stdio.h>

#include<malloc.h>

#include<string.h>

#definen10

typedefstructnode

stud;

stud*creat(intn)

h->name[0]=』』;

h->llink=null;

h->rlink=null;

p=h;

for(i=0;i<n;i++)

p->rlink=s;

printf("請輸入第%d個人的姓名",i+1);

scanf("%s",s->name);

s->llink=p;

s->rlink=null;

p=s;

}h->llink=s;

p->rlink=h;

return(h);

}stud*search(stud*h,char*x)

printf("沒有查詢到該資料!");

}voidprint(stud*h)

printf("n");

}voidinsert(stud*p)

printf("請輸入你要插入的人的姓名:");

scanf("%s",stuname);

strcpy(s->name,stuname);

s->rlink=p->rlink;

p->rlink=s;

s->llink=p;

(s->rlink)->llink=s;

}main()

3、刪除

刪除某個結點,其實就是插入某個結點的逆操作。還是對於雙向迴圈鍊錶,要在連續的三個結點s,p,q中刪除p結點,只需把s的右鏈域指標指向q,q的左鏈域指標指向s,並收回p結點就完成了。

下面就是乙個應用雙向迴圈鍊錶刪除演算法的例子:

#include

#include

#include

#definen10

typedefstructnode

stud;

stud*creat(intn)

h->name[0]=』』;

h->llink=null;

h->rlink=null;

p=h;

for(i=0;i〈n;i++)

p-〉rlink=s;

printf("請輸入第%d個人的姓名",i+1);

scanf("%s",s->name);

s->llink=p;

s->rlink=null;

p=s;

}h->llink=s;

p->rlink=h;

return(h);

}stud*search(stud*h,char*x)

printf("沒有查詢到該資料!");

}voidprint(stud*h)

printf("n");

}voiddel(stud*p)

main()

(四)迴圈鍊錶及雙向鍊錶

約瑟夫問題 迴圈鍊錶的特點 判斷單鏈表中是否有環 例題雙向鍊錶 對於單鏈表,由於每個結點只儲存了向後的指標,到了尾部標識就停止了向後鏈的操作。也就是說,按照這樣的方式,只能索引後繼節點,不能索引前驅節點。不從頭結點出發就無法訪問到全部節點,故有了迴圈鍊錶 鍊錶儲存結構定義 typedef struc...

C 實現雙向迴圈鍊錶

雙向迴圈鍊錶 除錯正常,所有功能均測試 節點類 template class listnode listnode type d,listnode n nullptr,listnode p nullptr data d next n prev p void setdata type d 雙向迴圈鍊錶 ...

迴圈鍊錶,雙向鍊錶

迴圈鍊錶 迴圈鍊錶與順序鍊錶之間的區別 迴圈鍊錶最後乙個資料的next指標域不為空,而是指向頭結點,其他基本操作大體相同,只是在判斷表結束的條件變為判斷節點的引用域是否為頭引用 雙向鍊錶 author neosong date oct 10,2017 4 43 01 pm program of in...