鍊錶的使用(VS2010中實現)

2021-08-29 18:02:40 字數 3274 閱讀 8246

今天將給大家講述鍊錶的學習心得。學習資料結構,毋庸置疑鍊錶必須學好,後面的棧、佇列、樹、圖都是以鍊錶為基礎的;鍊錶的種類很多,有單鏈表、雙鏈表、迴圈鍊錶、非迴圈鍊錶;在此,我們以非迴圈單鏈表為例,來講鍊錶的建立、求長度、排序、插入和排序。

鍊錶我的理解要包含以下特徵:(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一起放到你新建的工程目錄你。比如...