目錄
- 傳統藝能😎
- 過渡區🤣
- 正片開始👀
- 頭插操作👏
- 頭刪操作👏
- ==小小總結==
傳統藝能😎
小編是大一菜鳥不贅述,歡迎大佬指點江山(QQ:1319365055)
此前博客點我!點我!請搜索博主 【知曉天空之藍】
喬喬的gitee代碼庫(打灰人 )歡迎訪問,點我!

過渡區🤣
現在是北京時間19:34,普普通通周天無事發生,昨晚熬到兩點早上就硬關了三次鬧鐘睡到快10點(針不戳),馬上到考試周了,四級完了還是逃不了坐牢,晚上還是得做兩套真題壓壓驚才行,

正片開始👀
頭插操作👏
繼上一章內容,繼續講講順序表的基礎操作,
和尾插不一樣,尾插出手闊綽直接的開空間,咱頭插能開嗎?好像沒聽說過哪個介面可以在資料前面開一片空間吧,那我們思路就只有一個了——挪資料,那應該從第一位開始挪嗎?注意,這和 memcpy 函式機制是一樣的,并不意味著后面資料一起挪動,也不會彼此獨立,而是相互影響,挪動的資料會對后面資料進行覆寫,

那我們的邏輯就應該是從后往前挪,那我們就直接定一個下標,指向這段空間的最后一個位置即可,再利用香香 while 回圈一手:
void pushfront(st* s, type x)
{
assert(s);
int end = s->size - 1;
while (end >= 0)
{
s->a[end + 1] = s->a[end];//將從后往前的資料都向后挪一位
end--;
}
s->a[0] = x;
s->size++;
}
我們的 end 下標不是指向 size ,而是size后面一位也就是我們初始的capacity,end = 0時處理的是第一位之后的資料,那么我們while回圈時就應該回圈到 end<0為止,挪完了就可以sei資料,最后不要忘了讓size++,
結果如下:

我們如果對之前寫尾插時的細節記得的話,我們是需要有擴容操作的,這么寫過去寫過來很難受啊,我們就直接做成介面直接呼叫豈不美哉?
void enough(st* s)
{
if (s->size == s->capacity)
{
s->capacity *= 2;
s->a = (type*)realloc(s->a, sizeof(type) * s->capacity);
if (s->a == NULL)
{
printf("擴容失敗\n");
exit(0);
}
}
}
頭刪操作👏
一樣的,在頭刪操作時不僅要像尾刪一樣置0,還得把資料挪回去,注意是從前往后挪,不然資料又會被覆寫,最后size–一下就搞定:
void popfront(st* s)
{
assert(s);
enough(s);
int head = 0;
while (head < s->size - 1)
{
s->a[head] = s->a[head + 1]; //從前往后的資料依次向前挪一位
head++;
}
s->size--;
}
結果如下:

小小總結
綜上所述,順序表其實就是在陣列的基礎上保留了一個特性——資料是連續的,但又擺脫了陣列固定大小的限制,他適應性超強,隨插隨刪隨改,
但是順序表不是十全十美,我們資料量足夠龐大,比如已有一萬條資料的空間,我要插入一萬零一條,增容就會增到兩萬,空間浪費率極高,另外,尾插尾刪操作是很快的,直接放入拿走資料,這是順序表最常見的操作,這是他的特長,
但是話說回來,頭插頭刪也很快嗎?顯然不是,頭插頭刪的時間復雜度是O(n), 代價全在資料挪動上,所以如果要想不挪動的話,就要涉及到鏈表的引入,但鏈表在二分查找,排序等方面都有致命缺陷,他不能隨機訪問,所以鏈表和順序表是相輔相成的,
今天就先到這里吧,摸了家人們,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/387895.html
標籤:其他
上一篇:【參賽作品44】開源資料庫 | 記一次基于鯤鵬歐拉作業系統openGauss實踐程序
下一篇:圖的寬度優先遍歷
