C 資料結構之單鏈表

2021-09-22 18:49:24 字數 3198 閱讀 4776

線性表有兩種結構,順序儲存結構和順序儲存結構,順序儲存結構的線性表理解起來很簡單。

對於順序儲存,我們首先能想到的陣列,而順序儲存的線性表就是將結構體+陣列的這一種組合來實現。例如:

#define maxsize 20

typedef

int elemtype;

typedef

struct

sqlist;

使用的時候只需要建立乙個sqlist變數即可,順序儲存結構方便我們進行查詢和修改操作,只需要知道它的下標就可以定位到指定元素。然而,對於順序儲存,如果我們需要插入或者刪除元素,效率將是極低的。 例如,如果需要增加乙個元素,為了不破壞順序連線性,選好插入位置之後,必須將該位置之後所有的元素都向後移動一位,這就增加了時間複雜度,具體不談。

線性表還有一種結構:鏈式儲存結構。鏈式儲存結構結合了結構體和指標,使得元素和元素之間通過指標變數進行聯絡,你不一定要在我旁邊,我知道你在哪就行。

typedef

struct node

node;

鍊錶有乙個特殊的東西,叫做指標,這個指標指向了下乙個元素,所以遍歷的時候,我們只需要知道起始指標便可一步步往下遍歷,找到最後一元素。約定了兩個指標:head和tail,其中tail的next指標指向null。

原始的增刪查改的操作在鍊錶中行不通,我們重點要關注指標這個東西,指標和位址緊密聯絡,所以鍊錶的增刪查改操作要和指標聯絡起來,總結起來無非幾句話:

1.插入操作:遍歷到插入位置,前指標的next指向要插入的元素,插入元素的next指向前指標的next;

2.刪除操作:遍歷到刪除位置,前指標的next指向刪除位置的next,注意一下,刪除的元素要free一下,釋放空間!!!

3.查詢操作:不多說,遍歷比較;

4.修改操作:來個計數器,遍歷到指定位置,修改資料域。

//檔名為clinklist.h。

#pragma once

#include

#include

#include

typedef

struct node

node;

class clinklist

;//node* gethead();

void

menu()

;//做了乙個選單

void

pushfront()

;//初始化鍊錶,向前插入資料

void

pushback()

;//初始化鍊錶,向後插入資料

void

deletenode

(void);

//刪除操作

void

insert

(int loc,

int data)

;//插入操作:形參為位置和資料

intgetlength()

;//獲取鍊錶長度

void

print()

;//列印操作

void

freem()

;//free記憶體

};

接下來在cpp檔案中實現標頭檔案中的函式:

#include

"clinklist.h"

clinklist:

:clinklist

(void

)//建構函式

clinklist::~

clinklist

(void

)//析構函式

void clinklist:

:pushback()

//初始化,向後插入操作

else

}void clinklist:

:pushfront()

//初始化,向前插入操作

//這裡剛學的時候有點疑問,對phead賦值的話會不會改變原先的值?改變了位址,其實位址指向的東西沒有變化。

else

}void clinklist:

:freem()

//釋放空間很好理解,只要增加乙個中間變數,從head開始,將下乙個賦值給這個中間變數,同時釋放當下變數,直到遍歷到null停止。

}void clinklist:

:print()

//列印不必多說,遍歷

}void clinklist:

:deletenode

(void

)//刪除操作需要特別注意刪除元素的位置

p2 = p;

//p2指向這個節點的前乙個節點

p = p -> ptr;

//p為當前節點}if

( p ==

null

)//刪除失敗提醒

std:

:cout <<

"沒有那乙個節點"

<:endl;

else

else}}

int clinklist:

:getlength()

//遍歷,設定個計數器,返回一下

return i;

}void clinklist:

:insert

(int loc,

int data)

//插入操作也需要注意一下插入的位置,本文做的比較不嚴謹,沒有做前插後插

else

if(loc == len)

//如果loc等於鍊錶長度,則將其插入尾指標

else

//其他情況做個計數器,遍歷到指定位置新建節點,連線前後就好}}

}void clinklist:

:menu()

//做了個小小的選單

接下來就是主函式了:

#include

"clinklist.h"

intmain()

case2:

case3:

case4:

case5:

case6:

case7:

}}return0;

}

作為資料結構的入門,鍊錶發揮了它及其重要的作用,本文只介紹了單鏈表,對於鍊錶的學習也是剛剛起步,關於多鍊錶和迴圈鍊錶,相信也只是在指標域上做做手腳,分析一下也並沒有很難,只是要理解一下這種思想,鍊錶在資料結構中處處體現,棧與佇列,樹等也將會使用到鍊錶的知識,希望多多交流,希望文章有所幫助。

資料結構之單鏈表 c

templatestruct node node t x,node next null templateclass linklist 1 預設建構函式 templatelinklist linklist 建構函式1 2 有參建構函式 templatelinklist linklist t a,int...

C 資料結構之單鏈表

建立鍊錶 1.頭插法 新結點的指標域儲存頭結點的指標域的值,頭結點的指標值修改為新結點的位址,即s next head next,head next s 順序不可更改 2.尾插法 新結點作為鍊錶的尾結點,因此新結點的指標值為null,即s next null,上一結點的指標指向新結點,即p next...

資料結構之單鏈表

date 08 07 06 descript 單鏈表的實現與應用 public class linlist public node gethead 定位函式 public void index int i throws exception if i 1 current head.next int j...