順序表(一直都不知道還有這玩意?)
所以以下是來自百度百科:
順序表是在計算機記憶體中以陣列的形式保存的線性表,線性表的順序存盤是指用一組地址連續的存盤單元依次存盤線性表中的各個元素、使得線性表中在邏輯結構上相鄰的資料元素存盤在相鄰的物理存盤單元中,即通過資料元素物理存盤的相鄰關系來反映資料元素之間邏輯上的相鄰關系,采用順序存盤結構的線性表通常稱為順序表,順序表是將表中的結點依次存放在計算機記憶體中一組地址連續的存盤單元中
其實我也不太懂,直到后來自己實作了一下這個結構,這貌似就是個容器的作用?相當于c++的vetcor?
我個人理解是,相當于咱們的錢包
如果有大佬進來的,明白的就用一個形象化的語言來描述一下作用…
他是個線性結構,其實也就是體現邏輯結構的動態陣列之類的吧
下面來實作一下吧:
首先是順序表的結構體封裝:
包括了一個字串陣列,陣列大小,順序表大小:
struct linerlist {
char* element;
int arrlen;
int size;
};
創建并初始化順序表:
struct linerlist* createlist(int capacity) {
if (capacity < 1) {
printf("創建順序表失敗");
return NULL;
}//安全性考慮
struct linerlist* list = (struct linerlist*)malloc(sizeof(struct linerlist));
list->arrlen = capacity;
list->element = (char*)malloc(sizeof(sizeof(list->arrlen)));
list->size = 0;
return list;
}
接下來就是實作插入,但是你想哈,插入元素多了,我們陣列是不是就不夠用了,我們是不是就得擴容,所以我們要實作的第一個函式是陣列擴大,我們很輕松的想到一個函式realloc重設陣列大小:
void changearray1D(char** array, int oldlen, int newlen) {//需要傳陣列指標
if (newlen < 0) {
printf("擴容失敗");
return;
}//安全性考慮
int lenth = oldlen > newlen ? oldlen:newlen;
*array = realloc(*array, lenth * sizeof(char));
return;
}
那么我來畫個圖來看一下這個插入:

它是得把索引位置要往后移動的,所以我們用一個函式來實作一下這個移動方便呼叫:
void copyarrtail(char* array,int arrsize, int index) {
for (int i = arrsize; i > index; i--) {
array[i] = array[i - 1];
}
}
接下來是插入的函式:
void insertelement(struct linerlist* list, int theindex, char element) {
if (theindex<0 || theindex> list->arrlen) {
printf("索引無效");
}
if (list->size == list->arrlen) {
//順序表大于陣列長度
changearray1D(&list->element, list->arrlen, 2 * list->arrlen);
list->arrlen = list->arrlen * 2;
}
//存盤,把當前索引下的元素移到后面去
copyarrtail(list->element, list->size, theindex);
list->element[theindex]=element;
list->size++;
}
接下來是洗掉元素的函式:畫個圖:

嘛,畫的難看了,將就看吧,也就是在index后面的元素覆寫前面的一個元素,然后縮小size,實作偽洗掉就可以了
函式體:
void copyfrontnum(char* array, int arraynum, int index) {
for (int i = index; i < arraynum; i++) {
array[i] = array[i + 1];
}
}//跟上面的是一樣的,寫個覆寫的函式實作一下
void deleeteelement(struct linerlist* list, int index) {
if (index < 0 || index >= list->size) {
printf("無效索引\n");
return;
}//安全性考慮
copyfrontnum(list->element, list->size, index);
list->size--;
}
下面是主函式來檢驗一下我們寫的是否成功
void print(struct linerlist* list) {
for (int i = 0; i < list->size; i++) {
printf("%c\t", list->element[i]);
}
printf("\n");
}
int main() {
struct linerlist* newlist = createlist(2);
insertelement(newlist, 0, 'a');
print(newlist);
insertelement(newlist, 1, 'b');
print(newlist);
insertelement(newlist, 2, 'c');
print(newlist);
deleeteelement(newlist, 1);
print(newlist);
}
輸出結果:

好了,順序表就到這里了,我就暫且理解為一個容器就可以了,,,
我真菜啊…
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/257451.html
標籤:其他
上一篇:Java基本資料型別
下一篇:考公注意事項
