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域。雙向鍊錶也分為帶頭節點和不帶頭...