(1)單鏈表的節點插入操作
假設p指向乙個節點,要將
s所指節點插入
p所指節點之後的操作如下:
s->next=p->next;
p->next=s;
(2)單鏈表的節點刪除操作
節點a,節點b,
......假設p
為指向a
的指標,只需要將
p的指標域
next
指向原來p
(注意釋放所刪除節點的記憶體空間)
q=p->next;
p->next=p->next->next;
free(q);//呼叫
free
函式來釋放
q所指節點的記憶體空間 (3
)尾插法建立單鏈表的演算法
假設有n
個元素已經儲存在陣列
a中,用尾插法建立鍊錶c。
void createlistr(lnode *&c,int a,int n){ //要改變的變數用引用型
lnode *s,
*r;
//s用來指向新申請的節點,
r始終指向
c的終端節點
int i;
c=(lnode *
)malloc
(sizeof
(lnode
));//申請c
的頭節點空間
c->next=null;
r=c; //r指向頭節點,因為此時頭節點就是終端結點
for(i=1;
i<=n;++i){//
迴圈申請
n個節點來接受陣列
a中的元素
s=(lnode *)malloc(sizeof(lnode));//s指向新申請的結點
s->data=a[i];//用新申請的節點來接受
a中的元素
r->next=s;//用
r來接納新結點
r=r->next;
r->next=null;
(4)頭插法建立單鏈表的演算法
void createlistr(lnode *&c,int a,int n){
lnode *s;
int i;
c=(lnode*
)malloc
(sizeof
(lnode
));
c->next=null;
for(i=1;i<=n;++i){
s=(lnode*)malloc(sizeof(lnode));
s->data=a[i];
/*下面兩句是頭插法的關鍵步驟*/
s->next=c->next;//s所指新節點的指標域
next指向c
中的開始節點
c->next=s;
(5)單鏈表的歸併演算法a和b
是兩個單鏈表,其中元素遞增有序,將a和
b歸併成乙個按元素值非遞減有序的鍊錶c,
c由a和
b中的節點組成。
具體做法描述如下:
已知a,
b中的元素遞增有序,可以從a,
b中挑選最小的元素插入
c的尾部,這樣當a,
b中的元素全部都插入
c中時,
c一定是遞增有序的。
注意:a和b
中的元素有可能乙個已經全部被插入到
c中,另乙個還沒有插完。若
a中所有的元素已經全部被插入到c中而
b還沒有插完,則說明
b中所有元素都大於
c中元素,因此只要將
b中的剩餘部分鏈結到
c的尾部即可。
void merge(
lnode *&a
,lnode *&b
,lnode *&c){
lnode *p=a->next;//p用來跟蹤
a的最小值結點
lnode *q=b->next;//q用來跟蹤
b的最小值結點
lnode *r;
//r始終指向
c的終端結點
c=a; //用
a的頭結點來做
c的頭結點
c->next=null;
free(b); //b的頭結點已無用,則釋放掉
r=c; //r指向
c,因為此時頭結點也是終端結點
while(p!
=null&&q!=null){//當p
與q都不空時,選取p與
q所指節點中的較小者插入c尾部
/*以下的
if else
語句中,
r始終指向當前鍊錶的終端結點,作為接納新節點的乙個媒介,通過它新結點被鏈結入
c並且重新指向新的終端結點,以便於接受下乙個新節點,這裡體現了建立鍊錶的尾插法思想*/
if(p->data<=q->data){
r->next=p;
p=p->next;
r=r->next;
else{
r->next=q;
q=q->next;
r=r->next;
r->next=null;
/*以下兩個
if語句將還有剩餘結點的鍊錶鏈結在
c的尾部*/
if(p!=null) r->next=p;
if(q!=null) r->next=q;
(6)採用尾插法建立雙鏈表
void createdlistr(dlnode *&l,int a,int n){
dlnode *s,*r;
int i;
l=(dlnode *)malloc(sizeof(dlnode));
l->next=null;
r=l;
for(i=1;i<=n;++i){
s=(dlnode*)malloc(sizeof(dlnode));//建立新結點
s->data=a[i];
/*下邊
3個語句將
s插入在
l的尾部並且r指向
s,s->prior=r;
這一句是和建立單鏈表不同的地方*/
r->next=s;
s->prior=r;
r=s;
r->next=null;
(7)雙鏈表查詢結點的演算法
在雙鏈表中查詢第乙個結點值為x
的結點。從第乙個結點開始,邊掃瞄邊比較,若找到這樣的結點,則返回指標,否則返回
null
。演算法**如下:
dlnode* searchnode(
dlnode *c
,int x){
dlnode *p=c->next;
while(p!=null){
if(p->data==x)
break;
p=p->next;
return p;//如果找到,則
p中內容是結點位址(迴圈因
break
結束);若沒找到,
//則p中內容是
null
(迴圈因
p=null
而結束)。因此這一句可以將題幹中要 //求的兩種返回值情況統一起來
(8)雙鏈表插入結點的演算法
假設在雙鏈表中p
所指的結點之後插入乙個節點
s,其操作語句為:
s->next=p->next;
s->prior=p;
p->next=s;
s->next->prior=s;//假如
p指向最後乙個結點,則本行可以去掉
(9)雙鏈表刪除結點
設要刪除雙鏈表中p
結點的後繼結點,其操作語句如下:
q=p->next;
p->next=q->next;
q->next->prior=p;
free(q);
一步一步學鍊錶
首先是基本框架 1.錄入鍊錶 2.插入乙個元素 3.刪除乙個元素 4.遍歷鍊錶,輸出所有 5.鍊錶排序 6.退出 看了一下資料,了解了不少,寫了基本框架,今天先把錄入和輸出給實現了吧!先把 貼出來 首先是主函式 include include define null 0 typedef struct...
C C 資料結構之鍊錶(一步一步拆解單鏈表)
困擾了很久的資料結構重新拾起來,參考部落格大牛的文章,思考出一點自己的理解,希望給在學習資料結構這條路上的兄弟姐妹有所幫助,也為自己家能夠理清思路。廢話不多說,直接上 所需標頭檔案如下並且遮蔽安全警告 define crt secure no warnings include include inc...
一步一步學習IdentityServer3 8
identityserver3結合hangfire及cookies中介軟體實現授權 idr3資料庫token過期管理 globalconfiguration.configuration.usesqlserverstorage hangfire globalconfiguration.configur...