線性表是最基礎的一種資料結構,這樣的資料物件包含的資料元素具有一對一的前驅後繼關係。
按其邏輯儲存方式的不同可分為兩類線性表:順序表和鏈式表。其中鏈式表又可分為線性鍊錶、迴圈鍊錶和雙向鍊錶。
下面分別介紹下這幾種線性表的資料結構:
1. 順序表
typedef struct sqlist;
插入演算法:i到n位整體後移,再將新資料插入到位置i。
超出容量時可用realloc擴充套件sqlist容量,realloc函式介紹: 原型
:extern void *realloc(void *mem_address, unsigned int newsize); 功能
:先按照newsize指定的大小分配空間,將原有資料從頭到尾拷貝到新分配的記憶體區域,而後釋放原來mem_address所指記憶體區域,同時返回新分配的記憶體區域的首位址。即重新分配儲存器塊的位址。
返回值:如果重新分配成功則返回指向被分配記憶體的指標,否則返回空指標null。
刪除演算法:要刪除第q位的數,從q+1到n順序前移。
2. 線性鍊錶和靜態鍊錶
typedef struct lnodelnode, *linklist;
插入演算法:通過頭指標遍歷找到待插入的位置i的節點,修改i、i-1和待插入節點的next指標。
同順序表比較,線性鍊錶少了整體後移的操作,而多了遍歷節點的操作。
綜合線性鍊錶和順序鍊錶的優點而構建出的就是靜態鍊錶,但它是以占用靜態記憶體為代價的,其定義如下:
#define maxsize 1000
typedef struct snode, slinklist[maxsize];
靜態鍊錶通過陣列來儲存資料,通過next指示下乙個資料在陣列中的位置。
3. 雙向鍊錶
typedef struct dulnodedulnode, *dulinklist;
其結構中多了乙個指向前乙個節點的指標,所以可以雙向遍歷查詢節點。
4. 迴圈鍊錶
表中的最後乙個節點的指標域指向頭結點,整個鍊錶形成乙個環。
5. 線性表的應用——多項式相加
p(x)=a0+a1x+a2x^2+...+anx^n
首先構建包含係數和指數的資料元素:
typedef struct elemtype;
乙個elemtype可以表示多項式的一項,再用此元素構造按指數遞增的線性表表示整個多項式。
若用順序表或靜態鍊錶表示多項式,需連續構造,指數跳躍很大的多項式會浪費很多位址空間;故用有序鍊錶來表示比較合適:
typedef linklist polynomial;
兩個多項式進行加法操作時,依次取出每個節點的expn元素作比較後再做相應操作,具體操作較簡單,這裡不再贅訴。 資料結構(線性表)
1.試寫一演算法,在無頭結點的動態單鏈表上實現線性表操作insert l,i,b 並和在帶頭結點的動態單鏈表上實現相同操作的演算法進行比較。status insert linklist l,int i,int b 在無頭結點鍊錶l的第 i個元素之前插入元素 belse insert 2.已知線性表中...
資料結構 線性表
參考 一 線性表 順序表 單鏈表 迴圈鍊錶 雙鏈表 順序表 1.表的初始化 void initlist seqlist l 2.求表長 int listlength seqlist l 3.取表中第i個結點 datatype getnode l,i 4.查詢值為x的結點 5.插入 具體演算法描述 v...
資料結構 線性表
include using namespace std define listsize 100 表空間的大小可根據實際需要而定,這裡假設為100 typedef int datatype datatype的型別可根據實際情況而定,這裡假設為int typedef struct seqlist 初始化...