C雙向鍊錶學習筆記

2021-06-13 03:11:48 字數 2761 閱讀 7753

c雙向鍊錶學習筆記

​語言:c語言

編譯環境:vc6.0

今天學習了kenneth a.reek著的《c和指標》一書,從中學習到了新知識,也發現了新問題,在這裡做一下記錄

首先先看一下**:

#include#includetypedef struct node 

node;

node *rootp;

int dll_insert(register node *rootp,int val)

newnode = (node *)malloc(sizeof(node));

if(newnode == null)

return -1;

newnode->val = val;

newnode->fwd = next;

this1 -> fwd = newnode;

if(this1 != rootp)

newnode -> bwd = this1;

else

newnode -> bwd = null;

if(next != null)

next -> bwd = newnode;

else

rootp -> bwd = newnode;

return 1;

}int link_head_init()

rootp->fwd = null;

rootp->bwd = null;

rootp->val = 0;

printf("init ok!\n");

return 1;

}void main()

while(1);

}

一、出現的問題:

1.根節點需要分配空間,並做初始化;

2.出現

please enter the path for dbgheap.c

這個錯誤的原因是因為但不除錯到庫函式時,這個函式沒有源**。可以用f10跳過。

二、雙向鍊錶知識:

1.雙向鍊錶中最重要的是在這個鍊錶中新增乙個節點,首先我們看一下把乙個節點插入到鍊錶時,可能出現的4種情況:

a.新值可能必須插入到鍊錶的中間位置

b.新值可能必須插入到鍊錶的起始位置

c.新值可能必須插入到鍊錶的結束位置

d.新值可能必須插入到鍊錶的起始位置,又可能必須插入到鍊錶的結束位置(既原鍊錶為空)

2.建立乙個雙向鍊錶的步驟:

a.宣告乙個鍊錶型別

typedef struct node 

node;

其中fwd是指向當前節點的前一節點指標,bwd是指向當前節點的後一節點指標,val為節點儲存的值。

b.定義根節點,並初始化它:

node *rootp;

int link_head_init()

rootp->fwd = null;

rootp->bwd = null;

rootp->val = 0;

printf("init ok!\n");

return 1;

}

上面的程式定義乙個根節點rootp,並利用int link_head_init()函式來將其初始化,在這個函式裡,malloc為動態分配記憶體函式,給rootp分配的空間大小問哦node的大小,在這裡需要注意的是一定要檢查是否分配成功。後面三句話為這個根節點初始化內容,由於鍊錶為空,所以將器fwd和bwd初始化為null。

c.插入節點函式:

int dll_insert(register node *rootp,int val)

newnode = (node *)malloc(sizeof(node));

if(newnode == null)

return -1;

newnode->val = val;

newnode->fwd = next;

this1 -> fwd = newnode;

if(this1 != rootp)

newnode -> bwd = this1;

else

newnode -> bwd = null;

if(next != null)

next -> bwd = newnode;

else

rootp -> bwd = newnode;

return 1;

}

在這個函式裡,首先定義了三個節點型別的指標,分別表示為指向新節點之前的那個節點,

新節點之後的那個節點和

新節點,然後利用for迴圈遍歷整個鍊錶,由於這裡採用了公升序排列,所以找到比當前值大的那個節點,退出for迴圈,如果發現了和當前值一樣的節點,則不新增新節點。然後利用malloc函式給新節點分配空間,將新節點的fwd指向next節點,將當前節點this1指向新節點。然後開始判斷當前節點是不是根節點,如果是,就將新節點的bwd指向當前節點this,否則指向null,又判斷是不是在鍊錶的末尾新增新節點,如果是則將根節點的bwd指向新節點newnode,否則將下乙個節點next的bwd指向newnode。

(未完待續)

鍊錶學習筆記 雙向鍊錶

這次 寫的是迴圈鍊錶,用的是節點連線。雙向鍊錶相比與一般鍊錶要注意的地方就是 頭部插入和尾部插入 不要進行空指標操作。非鍊錶尾部的處理 if next null node pre current 如果是在頭部插如 則沒有 前節點 if i 0 tlist lenght return 0 dlinkl...

雙向鍊錶學習筆記

1.鍊錶介面定義 package com.ncs.datastructure.linklist public inte ce ilinklist 2.雙向鍊錶的簡單實現 package com.ncs.datastructure.linklist import com.ncs.datastructu...

雙向鍊錶學習筆記

利用雙向鍊錶可以避免單鏈表的缺點,單鏈表的缺點就是查詢指標p指向的節點,必須從指標p開始遍歷整個鍊錶一遍,時間複雜度為o n 雙向鍊錶的每個節點有兩個指標乙個指標指向前驅節點,另乙個指向後繼節點 在雙向迴圈鍊錶中每個節點包括3個域,data域,prior域,next域。雙向鍊錶也分為帶頭節點和不帶頭...