順序儲存結構
c語言中可以用一維陣列來實現順序儲存結構
獲取元素操作
判斷線性表是否合法
判斷位置是否合法
直接通過陣列下標的方式獲取元素
插入元素演算法
判斷線性表是否合法
判斷插入位置是否合法
把最後乙個元素到插入位置的元素後移乙個位置
將新元素插入
線性表長度加
1 刪除元素演算法
判斷線性表是否合法
判斷刪除位置是否合法
將元素取出
將刪除位置後的元素分別向前移動乙個位置
線性表長度減
1**練習場:
先看list.c檔案的型別宣告:
#include #includelist.h中的型別宣告:#include
"sequencelist.h
"typedef
struct
tseqlist
tseqlist;
typedef voidseqlist;
typedef
void seqlistnode;
typedef unsigned int建立線性表:tseqlistnode;//很重要,慢慢看下去
typedef unsigned int tsize;
typedef unsigned int tleng;
/*注意紅色部分,ret是指向整個線性表的指標,ret指向一片malloc開闢的記憶體(如果你對malloc開闢的記憶體是否是連續的有疑問這裡),ret+1剛好指向node後面緊挨的記憶體,記憶體示意圖如下:建立線性表,建立失敗返回null
*/seqlist *sequencelist_create(tsize capacity)
if(ret!=null)
return
ret;
}
雖然返回值型別貌似和我們定義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, intpos)
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, intmain.c:pos)
slist->length--;//
刪除乙個,長度遞減
}
return ret;//
返回當前刪除位置元素的位址
}
#include #includesequencelist.h:#include
"sequencelist.h
"int main(int argc, char *ar**)
printf("\n
");while( sequencelist_length(list) > 0
)
sequencelist_destroy(list);
//釋放堆空間
return0;
}
#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我們插入浮點數就ok,我們的**是和型別無關的,甚至,你還可以插入結構體。它執行如下:#include
"sequencelist.h
"int main(int argc, char *ar**)
printf("\n
");while( sequencelist_length(list) > 0
)
sequencelist_destroy(list);
//釋放堆空間
return0;
}
但是我們切不可犯了低階錯誤,插入不同型別的元素,比如,你要麼插入int型別的,要麼插入浮點型別的,不能第乙個插入folat,第二個又插入int,這是犯了概念錯誤,線性表元素型別必須相同。
warning:
還有,在執行這個**的時候你的編譯器或許會給出警告:
從指標轉換為不同大小的整數。我們的編譯器是64位的,指標是8個位元組,但是我們使用的是typedef unsigned int tseqlistnode;這樣乙個四個位元組的容器來存放8個位元組的資料,顯然是會出問題的(執行將導致段錯誤)。但要是你的編譯器是32位的則不會出現問題,這也就是為什麼我說可能你執行會出現這樣的警告。知道了問題所在,那麼我們就要改進**,更改標頭檔案增加如下內容:
#define compiler_64bit#ifdef compiler_32bit通過條件編譯,選擇不同大小的容器存放指標。這樣之後(在freertos中經常看到這種用法),使用多少位的編譯器對應開啟多少位的巨集,可移植性得到大大的增強。typedef unsigned
int tseqlistnode;//
為了存放乙個指標強制型別轉化後的值
#endif
#ifdef compiler_64bit
typedef
long
long tseqlistnode;//
為了存放乙個指標強制型別轉化後的值
#endif
線性表的順序儲存 線性表的順序儲存結構
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...