第七課 線性表的順序儲存結構

2021-09-08 13:16:51 字數 4602 閱讀 3500

順序儲存結構

c語言中可以用一維陣列來實現順序儲存結構

獲取元素操作

判斷線性表是否合法

判斷位置是否合法

直接通過陣列下標的方式獲取元素

插入元素演算法

判斷線性表是否合法

判斷插入位置是否合法

把最後乙個元素到插入位置的元素後移乙個位置

將新元素插入

線性表長度加

1 刪除元素演算法

判斷線性表是否合法

判斷刪除位置是否合法

將元素取出

將刪除位置後的元素分別向前移動乙個位置

線性表長度減

1**練習場:

先看list.c檔案的型別宣告:

#include #include 

#include

"sequencelist.h

"typedef

struct

tseqlist

tseqlist;

list.h中的型別宣告:

typedef void

seqlist;

typedef

void seqlistnode;

typedef unsigned int

tseqlistnode;//很重要,慢慢看下去

typedef unsigned int tsize;

typedef unsigned int tleng;

建立線性表:

/*

建立線性表,建立失敗返回null

*/seqlist *sequencelist_create(tsize capacity)

if(ret!=null)

return

ret;

}

注意紅色部分,ret是指向整個線性表的指標,ret指向一片malloc開闢的記憶體(如果你對malloc開闢的記憶體是否是連續的有疑問這裡),ret+1剛好指向node後面緊挨的記憶體,記憶體示意圖如下:

雖然返回值型別貌似和我們定義ret的型別不一致,但是由於返回的是個void * 型別的指標,所以不管定義ret為何種型別的指標,都可以賦值給void *型別。

銷毀線性表:

/*

銷毀線性表

*/void sequencelist_destroy(seqlist *list)

獲取線性表長度:

int sequencelist_length(seqlist*list) 

return

ret;

}

獲取線性表容量:

int sequencelist_capacity(seqlist*list) 

return

ret;

}

線性表的插入:

int sequencelist_insert(seqlist* list, seqlistnode* node, int

pos)

for(i=slist->length; i>pos; i--)//

線性表從自身長度處一次後移,給pos位置騰出插入空間

slist->node[i] = (tseqlistnode)node;//

slist->length++;//

插入乙個,長度加1

}

return

ret;

}

seqlistnode* sequencelist_get(seqlist* list, int

pos)

return

ret;

}

刪除元素:

seqlistnode* sequencelist_delete(seqlist* list, int

pos)

slist->length--;//

刪除乙個,長度遞減

}

return ret;//

返回當前刪除位置元素的位址

}

main.c:

#include #include 

#include

"sequencelist.h

"int main(int argc, char *ar**)

printf("\n

");while( sequencelist_length(list) > 0

)

sequencelist_destroy(list);

//釋放堆空間

return0;

}

sequencelist.h:

#ifndef _seqencelist_h_

#define _seqencelist_h_typedef unsigned

int tseqlistnode;//

為了存放乙個指標強制型別轉化後的值

typedef unsigned int

tsize;

typedef unsigned

inttleng;

typedef

void

seqlist;

typedef

void

seqlistnode;

seqlist *sequencelist_create(tsize capacity);

seqlist sequencelist_destroy(seqlist *list);

seqlist sequencelist_clear(seqlist*list);

int sequencelist_length(seqlist*list);

int sequencelist_capacity(seqlist*list);

int sequencelist_insert(seqlist* list, seqlistnode* node, int

pos) ;

seqlistnode* sequencelist_get(seqlist* list, int

pos);

seqlistnode* sequencelist_delete(seqlist* list, int

pos);

#endif

執行效果:

當然也是可以支援輸入浮點數的,把插入元素型別換成浮點數,更改如下:

#include #include 

#include

"sequencelist.h

"int main(int argc, char *ar**)

printf("\n

");while( sequencelist_length(list) > 0

)

sequencelist_destroy(list);

//釋放堆空間

return0;

}

我們插入浮點數就ok,我們的**是和型別無關的,甚至,你還可以插入結構體。它執行如下:

但是我們切不可犯了低階錯誤,插入不同型別的元素,比如,你要麼插入int型別的,要麼插入浮點型別的,不能第乙個插入folat,第二個又插入int,這是犯了概念錯誤,線性表元素型別必須相同。

warning:

還有,在執行這個**的時候你的編譯器或許會給出警告:

從指標轉換為不同大小的整數。我們的編譯器是64位的,指標是8個位元組,但是我們使用的是typedef unsigned int tseqlistnode;這樣乙個四個位元組的容器來存放8個位元組的資料,顯然是會出問題的(執行將導致段錯誤)。但要是你的編譯器是32位的則不會出現問題,這也就是為什麼我說可能你執行會出現這樣的警告。知道了問題所在,那麼我們就要改進**,更改標頭檔案增加如下內容:

#define compiler_64bit#ifdef  compiler_32bit

typedef unsigned

int tseqlistnode;//

為了存放乙個指標強制型別轉化後的值

#endif

#ifdef compiler_64bit

typedef

long

long tseqlistnode;//

為了存放乙個指標強制型別轉化後的值

#endif

通過條件編譯,選擇不同大小的容器存放指標。這樣之後(在freertos中經常看到這種用法),使用多少位的編譯器對應開啟多少位的巨集,可移植性得到大大的增強。

線性表的順序儲存 線性表的順序儲存結構

1,本文實現乙個線性表 2,順序儲存定義 1,線性表的順序儲存結構,指的是用一段位址連續的儲存單元依次儲存線性表中的資料元素 2,在 c 中可以用乙個陣列作為介質來儲存資料元素 3,設計思路 1,可以用一維陣列實現順序儲存結構 1,儲存空間 t m array 2,當前長度 int m length...

線性表 線性表的順序儲存結構

線性表的順序儲存結構 線性結構是乙個資料元素的有序 次序 集。集合中必存在唯一的乙個 第一元素 集合中必存在唯一的乙個 最後元素 除最後元素外,均有唯一的後繼 除第一元素外,均有唯一的前驅。adt list 資料關係 r1 adt list 容易混的概念 引用符號 和引用型操作沒有關係 加工型操作 ...

線性表 線性表的順序儲存結構

include include using namespace std define ok 1 define error 0 define list init size 100 define listincrement 10 typedef int status typedef int elemty...