資料結構 線性表(一)

2021-06-14 06:28:31 字數 2559 閱讀 5518

我們在學習c語言的時候都用過陣列,再學深一點大概會學到結構體,鍊錶之類的。正常情況下,對於這一類的資料結構,我們都能看到他們的共同點。每乙個資料項之間都只跟另乙個資料項鏈結,所以我們把這一類的資料結構叫做線性表。不考慮實際記憶體位址的分配,從邏輯意義上看,我們可以把資料項都連起來,形成乙個像表一樣的東西。

那麼首先就讓我們來看看線性表的第一種形式吧———順序儲存結構。

其實順序儲存結構說白了就是我們曾經接觸的c語言中的陣列。但是陣列的長度是不可變的,可是我們線性表的長度可變,且所需要的儲存空間也是隨著需要而改變,所以我們在這裡用動態分配的方式給線性表分配空間。下面則是線性表的順序儲存結構。

#define ok 1

#define error 0

#define infeasible -1

#define list_init_size 100 //線性表儲存空間的初始分配量

#define listincrement 10 //線性表儲存空間的分配增量

#define elemtype int

typedef struct

sqlist;

在上述定義中,指標elem儲存的是線性表的基位址,length是線性表目前的實際長度。listsize則是初始化時,我們為線性表分配的初始空間大小。

知道了線性表的儲存結構之後,我們就得開始新建乙個線性表了啊,也就是線性表的初始化。所謂的線性表的初始化就是我們為要建的線性表分配乙個連續的已預訂好大小的儲存空間,同時將線性表的當前長度設為0,用listsize表示線性表的儲存容量,一旦因為插入新的元素而導致空間不足時,可以用realloc函式進行再分配,為線性表增加乙個大小為listincrement的空間。

int initlist_sq(sqlist &l)

現在我們就建好了乙個線性表啊!有了乙個空線性表之後,我們就該實現線性表的各種功能了——首先是最基本的插入和刪除。

對於插入功能,我們有兩種思路。第一種就是直接插入到線性表已儲存的資料後面,另一種就是我們提供乙個i值,然後插入到線性表第i個位置。

第一種思路的實現

int listinsert_sq(sqlist &l,int e)

p=&(l.elem[l.length]); //p為插入資料的位置

*q=e; //插入資料e

l.length++; //實際順序表的長度+1

return ok;

}

第二種思路的實現

int listinsert_sq(sqlist &l,int i,int e)

q=&(l.elem[i-1]); //q為插入位置

p=&(l.elem[l.length-1]); //表尾

for(; q<=p; p--) //插入位置和之後的所有元素後移

*q=e; //插入e

l.length++; //實際順序表的長度+1

return ok;

}

現在我們就來實現線性表的刪除吧

int sqlist_delete(sqlist &l,int i,int &e)

--l.length; //實際順序表的長度-1

return ok;

}

那再讓我們看看線性表順序儲存結構的其他操作吧

一、檢視空表

listempty(sqlist l)

二、檢視線性表中第i個位置的值

getelem(sqlist l,int i,elemtype &e)

三、返回cur_e的前驅元素

priorelem(sqlist l,int cur_e,elemtype &pre_e)

if(p<=q) pre_e=*(--p); //如果找到則將cur_e的前驅賦值給pre_e,否則返回error

else return error;

return ok;

}

四、返回cur_e的後驅元素

nextelem(sqlist l.int cur_e elemtype &next_e)

if(p如果找到則將cur_e的前驅賦值給pre_e,否則返回error。注意cur_e不能是表尾元素

else return error;

return ok;

}

我們知道,線性表的順序儲存結構的特點是在邏輯關係上相鄰的兩個元素在實體地址上也相鄰。因此,我們可以用乙個簡單的式子就能得到任意元素的儲存位置。然而,從另一方面來看,這種嚴格的相鄰性也造成了這種儲存結構的缺點:當你要進行資料的插入或者刪除時,需要移動大量的元素。於是,我們便有了接下來的另一種線性表的儲存結構——鏈式儲存結構。它不要求邏輯關係上相鄰的兩元素在實體地址上也相鄰,因此就避免了順序儲存結構的缺點。

資料結構(線性表)

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...

資料結構 線性表

線性表是最基礎的一種資料結構,這樣的資料物件包含的資料元素具有一對一的前驅後繼關係。按其邏輯儲存方式的不同可分為兩類線性表 順序表和鏈式表。其中鏈式表又可分為線性鍊錶 迴圈鍊錶和雙向鍊錶。下面分別介紹下這幾種線性表的資料結構 1.順序表 typedef struct sqlist 插入演算法 i到n...