C語言程式設計簡單卻重要的資料結構順序表全面講解

2022-09-24 09:21:10 字數 3326 閱讀 8045

目錄

本文主要介紹順序表的定義和常見靜態順序表的用法。

線性表(line list)是n個具有相同特性的資料元素的有限序列。線性表是一種在實際中廣泛使用的資料結構,常見的線性表有:順序表、鍊錶、棧、佇列、字串。

線性表在邏輯上是線性結構,也就是說是連續的一條直線。但在物理結構上並不一定是連續的,線性表在物理上儲存時,通常以陣列和鏈式結構的形式儲存

順序表是用一段實體地址連續的儲存單元依次儲存資料元素的線性結程式設計客棧構,一般情況下採用陣列儲存。在陣列上完成資料的增刪查改。

順序表一般可表示為:

1.靜態順序表:使用定長陣列儲存。

2.動態順序表:使用動態開闢的陣列儲存。

我們以簡單的靜態順序表進行引例(與動態順序表介面函式思想是一樣的)

**如下(示例):

#define n 10//這裡定義巨集是為了方便將來如果需要更改空間的大小,而**中用到的10過於多要更改多次,巨集定義直接改n大小即可

typedef int sqdatatype;//這裡順序表10個空間都是int型,如果將來要改變型別,可以在這裡把int改為所需型別

struct seqlist//單個資料直接定義變數,多個資料定義結構體

;ps:順序表的一些要求:

1.連續的物理空間儲存-用的是陣列

2.資料必須是從頭開始,依次儲存

2.1實現順序表介面,第一步要對順序表進行初始化

**如下(示例):

#include

#include//memset函式標頭檔案

//增刪查改等介面函式

void seqlistinit(struct seqlist *ps)

void testseqlist1()

int main()

//ps:如果這裡你覺得寫struct seqlist sl煩,你可以這樣改進**(這裡和2.1**對應)

//typedef struct seqlist//單個資料直接定義變數,多個資料定義結構體

//sl;

//這樣結構體型別就可以直接寫成sl

2.2對順序表的增刪查改的介面函式(以尾插為例)

void seqlistpushback(struct seqlist *ps, sqdatatype x)//尾插

ps->a[ps->size] = x;

ps->size++;//儲存的資料多了乙個,size加程式設計客棧1個

}乍一看**比較晦澀難懂,我們用圖來理解一下這個**:

(來自位元就業課)

圖示順序表有7個空間,我們放了5個資料,現在要在尾部插入乙個資料,該資料下標是5,而ps->size=5(結構體指標相關知識見筆者結構體文章)所以a[5]也就是a[ps->size]恰好是尾部後乙個元素,這裡的5改成其他數也是同樣的道理。

ps->a[ps->size]=x,也就是對尾部後乙個元素賦值。

ps->size++是表示順序表儲存的資料又多了乙個(原本認定順序表儲存5個資料,你現在新增了乙個,認定儲存幾個資料也要再加1個)

而你在尾插的過程中,可能插入資料多了,甚至多於陣列最大容量,這肯定會有問題,所以我們用了乙個if進行判斷一下。

到這裡大家可能就會發現了,在使用靜態鍊錶有兩個不方便的地方:

1.陣列給的空間小了,可能不夠用

2.陣列給的空間大了,可能浪費空間

3.1動態順序表初始化

**如下(示例):

typedef int sqdatatype;

struct seqlist

;//由於沒有陣列a了,所以順序表初始化也要改一下

void seqlistinit(struct seqlist *ps)

(來自位元就業課)

3.2動態順序表-尾插

**如下(示例):

void seqlistpushback(struct seqlist *ps, sqdatatype x)

else

}ps->a[ps->size] = x;

ps->size++;//儲存的資料多了乙個,size加1個

}我們在擴容時,是用乙個擴容乙個嗎?這樣太浪費時間,一般是擴容所需要的空間的兩倍,realloc函式可對指標指向的空間進行擴大或縮小,感興趣的同學自行了解,這裡不作深究。

3.3動態順序表-頭插

了解過尾插,這裡講頭插也很容易理解,就是在最前面插入乙個內容,如何操作呢?把已有的內容全部向後移動一位,然後最前面會空出乙個空間,然後你放入內容

**如下(示例):

void seqlistpushfront(struct seqlist *ps, sqdatatype x)

else

}int end = ps->size - 1;//確定最後乙個內容下標

while (end >= 0)

ps->a[0] = x;//把需要插入的內容放在最開始的空間

ps->size++;

}這裡需要注意的是,頭插和尾插都面臨乙個空間已經滿的情況,如果滿了都需要擴容,這個不要忘記。如果你嫌麻煩每次都要寫擴容,你可以寫乙個擴容函式,用的時候呼叫一下即可。

3.4動態順序表-尾刪

**如下(示例):

void seqlistpopback(struct seqlist *ps)

這裡為什麼size- -即可完成尾部資料的刪除?解釋是這樣的,size- -後,電腦認為的有效資料就少了乙個,不管你那個資料還在不在,電腦已經認為它不再是乙個所需的資料了,使用順序表時不會對無效資料進行考慮。

3.5動態順序表-頭刪

頭刪也就是把最前面的資料刪除,其他資料下標依次減1即可

**如下(示例):

void seqlistpopfront(struct seqlist *p程式設計客棧s)

ps->size--;

}3.6動態順序表-任意位置插入資料

我們以下面這個順序表舉例

我們要在1和2中間插乙個資料怎麼辦?0和1不變,2和3分別向後移

但是考慮到其他的順序表,假設它原來的資料已經佔滿了所有空間,你再插是不是有可能空間不夠,還有一點,雖說是任意位置插入資料,你能不能在順序表尾部插入?非法訪問了屬於是。考慮上面幾點,我們有下面的**。

void seqlistinsert(struct seqlist *ps, int pos, sqdatatype x)

//pos表示插入位置的下標

ps->a[pos] = x;

ps->size++;

}3.7動態順序表-任意位置刪除資料

我們仍以下面的圖舉例,要將2刪除怎麼辦?把3往前挪一位即可。

void seqlisterase(struct seqlist *ps, int pos)

ps->size--;

}ps:上述的所有刪除都是刪除資料,空間是不刪除的。

資料結構(c語言) 簡單迷宮

迷宮 對於乙個用空格和 號組成的迷宮,如下 這是乙個10 10的迷宮。如果碰到 那個方向就走不通。大致演算法 遞迴 初始點為 1,1 優先向右探路,不通就向下,還不通的就向左,再不通就向上探路。棧每走一步,判斷是否走過,如果沒有,就把座標記錄到棧中。如果有,返回上一層遞迴。include stdio...

資料結構整理 C語言程式設計(總)

對於漫長的程式設計之路我只是乙個路人,隨手撿起的石子我會扔到道路兩旁,摘下的花兒我會同人分享,遇見的泥濘坑窪我也願意同你訴說。今天開始學習資料結構,而後逐步漸入佳境,希望你同我一樣進步。個人喜歡比較庸俗的理解,方便記憶,語言粗鄙,還望見諒。如果非要分類,那資料結構可以分成資料的邏輯結構 物理結構 儲...

資料結構簡單C

1.陣列 一堆相同型別資料的集合 一定是在記憶體上佔據一塊連續的空間 1.1一維資料 1陣列的定義 資料型別 陣列名 大小 資料型別 陣列名 大小 初始化 int arr 10 陣列名是陣列首位址 2陣列的賦值 陣列名 下標 取到陣列某個元素 陣列下標範圍0 n 1 arr 4 10 3陣列的初始化...