C語言數(shù)據(jù)結構順序表中的增刪改(尾插尾刪)教程示例詳解
初始化
在初步認識順序表這一結構后,我們就可以繼續(xù)深入探究
這是我之前在.h文件中創(chuàng)建的結構體
typedef int type; typedef struct list { type* a; int size; int capacity; }st;
在處理順序表結構時我們會用到的一些接口,處理其中的關系,其實本質上就是函數(shù),這里我用復雜英文對應出來方便形成記憶。
void init(st *s); //插入 void pushback( st* p, type x);//尾插 void popback(st* p); //尾刪 void pushfront( st* p, type x); //頭插 void popfront(st* p); //頭刪 void insert(st* p, int n, type x); //中間位置插入 void erase(st* p, int n); //中間位置刪處
我用 init 函數(shù)實現(xiàn)簡單的初始化,首先會先把結構體成員傳過來,注意再次強調區(qū)別形參和實參,傳值調用肯定會報錯滴,乖乖的換成指針,其實不論是不是傳址調用,我們都可以搞成指針傳過去,為了保險起見。
我們第一步肯定是開辟空間,先用 malloc 函數(shù)參上,當然,null 還玩?zhèn)€屁屁,為了先避免掉這種情況,我們就 if 意思一下,然后給初始有效位設為 0,初始容量設為 5。
void init(st *s) { s->a = (type*)malloc(sizeof(type) * 4); if (s->a == NULL) { printf("申請內存失?。n"); exit(-1); } s->size = 0; s-> capacity = 1; }
尾插
然后就開始pushback 尾插操作:
void pushback(st* s, type x) { assert(s);//空指針判斷 s->a[s->size] = x; s->size++; }
還是老規(guī)矩,assert 斷言是否為空指針,再放行。往下就簡單的,把x的值放入數(shù)組的size 位置上,讓 size ++即可。
但是 malloc 這種的指針是指向獨立不連續(xù)的空間,我們監(jiān)視窗口觀察也只能看到一個個不連續(xù)的值,所以還是要老老實實搞一個打印函數(shù),和數(shù)組一樣,直接遍歷一下我們++過的size即可:
void print(st* s) { assert(s); int i = 0; for(i = 0; i < s->size; i++) { printf("%d ", s->a[i]); } }
結果如下:
格局打開
但是奇不奇怪,我 capacity 初始設定為 1,而我卻尾插了兩個數(shù)還沒有報錯,為什么捏?其實報錯了一定是你越界了,但沒有報錯不代表你就沒有越界,往往有些越界是檢查不出來的,因為還沒走到檢查的點上;就好比咱卷了不一定成功但不卷就一定不會成功。
所以我們的邏輯就要進行更替:
if (s->size >= s->capacity) s->capacity++;
在assert 后加上 if 判斷句,讓容量隨有效位及時更新,但是又有一個問題,當我數(shù)據(jù)量非常大時,我們使用一位開辟一位的方法讓 capacity++ 非常頻繁,但一下子開辟一大片空間有會浪費資源,到后面已有數(shù)據(jù)越多開辟越大浪費的越多怎么辦呢?我們比較普遍的做法就是開辟 2 倍:
if (s->size == s->capacity) { s->capacity *= 2; s->a = (type*)realloc(s->a, sizeof(type) * s->capacity); }
這里敏感的朋友應該張口就來realloc,realloc函數(shù)會對已有空間直接擴容,但不一定是原地擴容,后面有足夠的空間就會原地擴容,但是不夠就會找一塊新的空間將數(shù)據(jù)拷貝過去再釋放掉原來空間。上面代碼將原來的空間給realloc,再增容到我要的空間,就能很好的滿足我們的要求。
尾刪
尾刪沒什么技術含量,和我們數(shù)組的思路一樣
void popback(st* s) { assert(s); s->size--; }
結果如下:
以此類推,頭插頭刪是一個道理,不做贅述,更多關于C語言數(shù)據(jù)結構順序表增刪改的資料請關注腳本之家其它相關文章!
相關文章
關于C++靜態(tài)成員函數(shù)訪問非靜態(tài)成員變量的問題
靜態(tài)成員函數(shù)不能訪問非靜態(tài)成員,這是因為靜態(tài)函數(shù)屬于類而不是屬于整個對象,靜態(tài)函數(shù)中的 member可能都沒有分配內存。靜態(tài)成員函數(shù)沒有隱含的this自變量。所以,它就無法訪問自己類的非靜態(tài)成員2013-10-10Visual C++程序設計中Windows GDI貼圖閃爍的解決方法
這篇文章主要介紹了Visual C++程序設計中Windows GDI貼圖閃爍的解決方法,分析了GDI貼圖閃爍的常見原因及其具體解決方法,具有一定參考借鑒價值,需要的朋友可以參考下2015-01-01c++利用stl set_difference對車輛進出區(qū)域進行判定
這篇文章主要介紹了set_difference,用于求兩個集合的差集,結果集合中包含所有屬于第一個集合但不屬于第二個集合的元素,需要的朋友可以參考下2017-03-03