今天將給大家講述鍊錶的學習心得。學習資料結構,毋庸置疑鍊錶必須學好,後面的棧、佇列、樹、圖都是以鍊錶為基礎的;鍊錶的種類很多,有單鏈表、雙鏈表、迴圈鍊錶、非迴圈鍊錶;在此,我們以非迴圈單鏈表為例,來講鍊錶的建立、求長度、排序、插入和排序。
鍊錶我的理解要包含以下特徵:(1).由n個節點離散分配;(2).每個節點通過指標連線(3)每乙個節點由乙個前驅節點和乙個後驅節點(4).首節點沒有前驅節點,尾節點沒有後驅節點;
滿足上面的4條,我們就稱為鍊錶;鍊錶既然由很多個節點,那節點又由什麼組成?節點由兩個部分組成,一是資料域,用來存放有效資料;二是指標域,用來指向下乙個節點;下面用c語言來構建鍊錶資料結構,首先應該構造出節點,然後再把所有的節點連起來,就構成了鍊錶;
(1)節點的構造
struct node
; //有的人習慣這樣寫"}struct node,*node *;" struct node等價於 struct node; node *等價於struct node *; 此處用大寫是為了與變數區分,可以讓人容易變出是個資料型別
//其實可以直接省略掉,因為這樣命名太多了很麻煩
(2)鍊錶的建立
在建立鍊錶之前,我們需要需要了解一下專業術語:
首節點:存放第乙個有效資料的節點;
尾節點:存放最後乙個有效資料的節點;
頭節點:頭節點的資料型別與首節點的資料型別相同,並且頭節點是首節點前面的那個節點,並不存放有效資料;頭節點的存在只是為了方便鍊錶的操作。
頭指標:指向頭節點的指標;
尾指標:指向尾節點的指標;
首先,我們應該建立乙個頭節點,並用頭指標指向它,用c語言描述:用malloc向計算機申請一塊記憶體,並定義乙個指向與頭節點資料型別相同的指標(一定要判斷申請記憶體是否成功);
然後,要知道要建立鍊錶的長度,用乙個迴圈來每次建立乙個節點,並把每個節點連在一起;
假如我們要在頭節點phead後面插入節點p:
(1)把頭節點的指標域指向p節點,即phead->pnext=p;
(2)把p節點的指標域指向null,即p->pnext=null;
這樣就可以了嗎? 想想我們就可以發現,當我們要插入多個節點時,頭節點始終指向最後新增的乙個資料,以前的節點通過頭指標此時已經找不到了;我們定義乙個尾指標ptail,始終用來指向鍊錶的結尾,每次只在ptail後面新增節點。
偽演算法:
(1)定義乙個尾指標ptail,並初始化,使它指向頭節點,即ptail=phead;
(2)在ptail後面新增節點,修改指標:
ptail->pnext=p;
p->pnext=null;
ptail=p; //使ptail指向鍊錶最後乙個元素
///建立乙個鍊錶//
假如要在節點2的前面插入節點p,我們首先要找到節點2的前驅節點1,假設現在q指標指向節點1,則
(1)p->pnext=q->pnext;
(2)q->pnext=p;
程式**如下:
/鍊錶的插入/
//鍊錶的第pos有效元素前面插入元素val,首先我們應該找到第pos個元素前面乙個元素的位置;
//當鍊表有3個元素時,pos=4,將不會進行插入操作
bool insert_list(node * phead,int pos,int val)
if(p==null||i>pos-1) //把鍊錶為空的情況考慮進去了;i>pos-1 可以防止使用者輸入錯誤;
return false;
//程式執行到這之後,i=pos-1;p指標指向鍊錶第pos個有效節點的前驅,即指向第pos-1節點;
node * q=(node *)malloc(sizeof(struct node));
q->data=val;
q->next=p->next;
p->next=q;
}
3.刪除鍊錶中的元素
假如要刪除節點2,只需要把節點1指標域指標指向節點3,但不要忘記釋放節點2所佔的記憶體,否則將會造成記憶體洩漏;首先必須找到節點2的前驅節點1,假設p指向節點1。
(1)q=p->pnext; //首先用q儲存要刪除節點的位址;
(2)p->pnext=q->pnext; //q->pnext=p->pnext->pnext; 修改指標使節點1指向節點3;
(3)free(q); //釋放節點2所佔的記憶體;
//鍊錶的刪除//
bool delete_list(node * phead,int pos) //,int *val
if(p==null||i>pos-1) //把鍊錶為空的情況考慮進去了;i>pos-1 可以防止使用者輸入錯誤;
return false;
//程式執行到這之後,i=pos-1;
node * q=p->next; //q指向待刪除的節點;
//*val=q->data;
p->next=q->next; //修改鍊錶指標指向;
free(q); //釋放q所指向節點的記憶體;
q=null;//千萬不可以忘記,否則會出現野指標;
}
快速排序和氣泡排序的思想對於鍊錶這個資料結構同樣適用,下面是乙個用選擇排序來實現鍊錶的排序;
///求鍊錶有效元素的個數///
int length_list(node * phead)
return len;
}
對鍊錶中的元素進行排序///
void sort_list(node * phead)
} }}
列印鍊錶/
void print_list(struct node **head)
printf("\n");
}
int main()
VS2010中dumpbin工具的使用
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!用vs2010生成的.obj檔案 lib庫 dll庫 exe執行檔案,如果想檢視其中這些檔案或庫包含了哪些函式以及相關的資訊 符號清單 可以通過vs2010自帶的dumpbin工具來完成。dumpbin.exe為microsoft coff二進位制...
如何提高VS2010的效能,VS2010不再卡
教大家幾個技巧可以稍微讓你覺得它沒那麼卡!一 vs2010選項視覺體驗設定 工具 選項 環境 視覺體驗的勾選都去掉。不解釋,你懂得。不過還是建議開啟硬體加速 二 禁用intellisense 工具 選項 文字編輯器 c c 高階 禁用intellisense設為true 這個功能很好用。相較於vis...
vs2010中使用curl 配置
第四步 開啟curl 7.21.5 lib dll debug 找到libcurld.dll和libcurld imp.lib。第五步 開啟curl 7.21.5 include 找到curl檔案和第四步找到的libcurld.dll和libcurld imp.lib一起放到你新建的工程目錄你。比如...