線性表包括順序儲存結構和鏈式儲存結構

2021-07-14 14:47:19 字數 3914 閱讀 9561

還記得資料結構這個經典的分類圖吧:

今天主要關注一下線性表。

線性表的劃分是從資料的邏輯結構上進行的。線性指的是在資料的邏輯結構上是線性的。即在資料元素的非空有限集中

(1) 存在唯一的乙個被稱作「第乙個」的資料元素,(2) 存在唯一的乙個被稱作「最後乙個」的資料元素,(3) 除第乙個外,集合中的每個資料元素均只有乙個前繼元素,(4)除最後乙個外,集合中的每個資料元素均只有乙個後繼元素。

那麼對於線性表,從儲存結構上分,可以有順序儲存結構和鏈式儲存結構。順序儲存結構包括順序表、順序佇列和順序棧;鏈式儲存結構包括鍊錶、鏈佇列和鏈棧。所有這些分類資料結構的實現,後續的博文將陸續進行介紹。

順序表的結構如下圖所示:

從結構上可以看出,順序表實際上就是乙個動態陣列,在c++的標準模板庫(stl)中類似的對應著vector模板類。所以理解順序表對於使用vector進行高階應用的開發有著極為重要的作用。

儲存結構定義如下:

typedef struct

seqlist;

typedef int datatype;

void setlist(seqlist *l,int n);// 建構函式,建立陣列長是n的空表

void freelist(seqlist *l); // 

析構函式

,釋放陣列空間

int listsize(seqlist *l) // 

求表的長度

int isempty(seqlist *l); // 

判斷陣列是否空

,1:空,0滿

int iffull(seqlist *l); // 

判斷陣列是否滿

datatype getdata(int pos); // 

獲取陣列某元素

int locate(seqlist *l,datatypeitem); // 

判斷元素位置

void setdata(seqlist *l,datatypeitem,int pos); //

元素位置賦值

void insert(seqlist *l,int pos,datatype item); //

在某位置插入元素

void insertrear(seqlist *l,datatype&item); // 

在末尾插入元素

void delete(seqlist *l,int pos);//

刪除某位置元素

void clearlist(seqlist *l); // 清表,

表中的元素個數是

0;void deletebetween(seqlist *l,intstart, int end)

對應某些函式方法的實現如下:

voidsetlist(seqlist *l,int n)

l->m_nmax=n;

l->m_nsize=0;

}void freelist(seqlist *l)

void insert(seqlist *l,datatype item,int pos)

if(pos<=0||pos>l->m_nsize)

for(i=l->m_nsize-1;i>=pos;i--)

l->m_ndata[i+1]=l->m_ndata[i];

l->m_ndata[pos]=item;

l->m_nsize++;

}c語言字串

char str[13]=「hello, world!」;

char *pstr = str;

字串函式

gets(char *str);

puts(char *str);

strcpy(char *str1, char *str2); //字串拷貝

strcat(char *str1, char *str2); //字串連線,str1必須足夠大

strcmp(char *str1, char *str2); //字串比較

strlen(char *str); //字串求長,不包含』\0』的長度

動態字串:

typedef struct

string;

基本運算: concat(), substring(), insert(),delete(),clear()…

一種特殊的線性表:只能在表的一端插入,另一端刪除,是先進先出的線性表;頭指標(刪除位置)和尾指標(插入位置)

first come, first serve(fifo)

優點:迴圈結構、刪除時不需移動元素

順序佇列的結構如下圖所示:

儲存結構定義如下:

typedef struct

queue;

void setqueue(queue *q,int n); // 建構函式

void freequeue(queun *q); // 析構函式

int qsize(queue *q); // 佇列長度

int qempty(queue *q); // 判斷佇列是否空

int qfull(queue *q); // 判斷佇列是否滿

datatype qgetdata(queue *q); // 獲取資料

int qinsert(queue *q,datatype item); // 進佇列

datatype qdelete(queue *q); // 出佇列

void qclear(); // 清空

佇列刪除操作:

datatypeqdelete(queue *q)

item=q->m_pdata[q->m_nfront];

q->m_nfront=(q->m_nfront+1)%q->m_nmax;

q->m_nsize--; }

一種特殊的線性表:只能在表的一端插入和刪除,是後進先出的線性表;進棧和出棧

結構如下圖所示:

順序棧的基本操作如下:

cstack()/cstack(int n); // 建構函式

~cstack(); // 析構函式

int setsize(int n); // 設定棧的大小

int free(); // 釋放空間

int size(); // 棧的大小

int empty(); // 判斷是否空

int full(); // 判斷是否滿

int push(datatype item); // 壓棧

datatype pop(); // 出棧

datatype getpeek(); // 取棧頂元素

int clear(); // 清空棧

順序棧的基本運算函式宣告如下:

void setstack(stack *s,int n);

void freestack(stack *s);

int stackempty(stack *s);

int stackfull(stack *s);

void push(stack *s,datatype item);

datatype pop(stack *s);

void clearstack(stack *s);

datatype peek(stack *s);

線性表順序儲存和鏈式儲存

輸入第1行是乙個整數n,表示之後還有n行輸入。每行輸入表示對線性表的一條操作指令,格式是 指令編號 引數1 引數2 如有 指令編號為3,表示find操作,此時只有乙個引數,即待查元素的值。順序儲存 include using namespace std const int maxn 1e4 1 st...

線性表之順序儲存結構和鏈式儲存結構

一 順序儲存結構 線性表幾種基本操作的思路 1 插入演算法 1 插入位置不合理,丟擲異常 2 線性表長度超過 陣列長度,丟擲異常或者是動態增加陣列容量 效率會變低 3 從最後乙個元素向前遍歷到第i個位置,分別將它們後移一位。4 將要插入的元素插入在i處 5 線性表長度要 1 2 刪除演算法 1 刪除...

線性表之順序儲存結構和鏈式儲存結構

線性表包括順序表和煉表,其中鍊錶又包括單鏈表 迴圈鍊錶 雙向鍊錶。順序儲存結構和鏈式儲存結構有所不同,具體區別如下表所示 線性表是一種邏輯結構,相同資料型別的n個資料元素的有限序列,除第乙個元素外,每個元素有且僅有乙個直接前驅,除最後乙個元素外,每個元素有且僅有乙個直接後繼。線性表的特點 元素個數有...