線性表有兩種結構,順序儲存結構和順序儲存結構,順序儲存結構的線性表理解起來很簡單。
對於順序儲存,我們首先能想到的陣列,而順序儲存的線性表就是將結構體+陣列的這一種組合來實現。例如:
#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...