時隔一年,再一次開啟了嚴奶奶的這本資料結構,事實證明這一年裡還是有進步的,原因在於,我盡然能看懂這本書了,雖然與c語言交情不深,但是資料結構畢竟是凌駕於語言之上。
今兒個開始第乙個---->順序表的編輯
嚴奶奶的書上原始碼都有,因為是類c原始碼,所以有的寫地方需要進行小小的改動,也給一年沒有碰過指標的我上了一課o(╥﹏╥)o。如果有哪個大佬有一天能看見我發的這篇文章,有什麼錯誤,還請批評指出。
標頭檔案:
#include
#include
函式結果狀態碼:
狀態碼在課本p10有提到
其中的elemtype和status相當於給整型int起了個別名,和int的作用一模一樣
#define list_init_size 100
//初始分配量
#define listincrement 10
//分配增量
#define overflow -1
//狀態碼
#define ok 1;
#define error -1;
typedef
int elemtype;
typedef
int status;
由於線性表的長度可變,且所需的最大儲存空間隨問題的不同而不同,可以為其動態分配一維陣列,**如下有兩種定義方法:
1,結構體標籤命名,
此時的sqlist可以去宣告新的結構體變數,如之後原始碼中的sqlist la
struct sqlist
;
2,也可以用typedef建立新型別,
此時的sqlist可以去宣告新的結構體變數,如之後原始碼中的sqlist la
typedef
struct
sqlist;
status initlist
(sqlist &l)
l.length =0;
l.listsize = list_init_size;
return ok;
}
到這裡前戲完成
演算法不管是插入還是刪除,還是線性表的合併,書上講的都特別清楚,除了把原始碼拷過來之外,還想補充一點自己的小理解嘻嘻o(∩_∩)o。
下面的演算法中有形參變數前新增了&,書本p10,這是借用了c++老大哥的引用呼叫的引數傳遞,會直接對實參進行處理,換句話說,傳值引用一般就是生成乙個臨時物件,而引用呼叫是呼叫引數本身。但是區別於指標形參,值不能為null且不能更改指向的記憶體。
status listinsert
(sqlist &l,
int i, elemtype e)
if(l.length >= l.listsize)
l.elem = newbase;
l.listsize +
= listincrement;
}int
*q =
&(l.elem[i-1]
);//插入位置及之後的元素後移
for(
int*p =
&(l.elem[l.length-1]
);p>=q;p--
)*q = e;
l.length++
;return ok;
}
realloc函式,為線性表擴容。判斷i的數值是否合法,以及插入位置及之後的元素後移書上都有詳細解釋。
這裡乙個地方耗了我好長時間 int *q = &(l.elem[i-1]); 還是不熟悉指標的原因吧,後來查了 菜鳥教程,才了解了大概,elem是int型指標, elem[數值-1] 就相當於 陣列名[數值-1] 也相當與於 *(elem+數值) 遍歷當前陣列的第(數值)個元素,感覺以後還會範糊塗,先把此時的理解留在這裡吧。
後面的沒怎麼鑽牛角尖,理解起來相對順暢一點,也相應的做了注釋,不做過多的闡述了(其實就是懶)
/*
刪除第i個元素
*/status listdelete
(sqlist &l,
int i, elemtype &e)
//被刪除元素位置
int*p =
&(l.elem[i-1]
);e =
*p;//此時的表長度 elem基址後移length-1位,指向表元素的最後一項
int*q = l.elem+l.length-1;
//刪除位置之後的元素前移,覆蓋前一項
for(
*p;p)//表長度減一
l.length--
;return ok;
}
void
listupdate
(sqlist &l,
int i)
status listselect
(sqlist &l,
int num,
int&index)
}return-1
;}
void
mergelist
(sqlist &la, sqlist &lb, sqlist &lc)
while
(pb <= p)
*pc++
=*pa++
;while
(pb <= q)
*pc++
=*pb++
;}
張某人借鑑了大佬的輸入(這裡是真的不會了o(╥﹏╥)o),so spisy,end。
main()
scanf
("%d"
,&lb.length)
;for
(int i=
0;i)mergelist
(la, lb, lc)
;//向la表的第三項插入數字100
// listinsert(la, 3, 100);
//刪除la表的第三項
// elemtype e;
// listdelete(la, 3 , e);
// printf("被刪除的元素-->%d\n",e);
//查詢第i個元素,若存在則返回元素第一次出現所對應的下標,不存在返回-1
// elemtype index;
// listselect(la, 3, index);
// printf("查詢元素的下標為-->%d\n",index);
printf
("操作完成,此時的表內容為");
for(
int i=
0;i)}
資料結構(嚴蔚敏)陣列順序表
c1.h 程式名 include include include malloc 等 include int max等 include eof z或f6 null include atoi include eof include floor ceil abs include exit 函式結果狀態 d...
資料結構(嚴蔚敏)串順序結構
c1.h 程式名 include include include malloc 等 include int max等 include eof z或f6 null include atoi include eof include floor ceil abs include exit 函式結果狀態 d...
資料結構 嚴蔚敏
最近一直想找一本純資料結構的書來學習,找來找去都沒有找到一本合適的書籍,相比之下國內的書籍之中,嚴蔚敏和吳偉民的還算是經典版了,很多國內其他資料結構教材都參考這本書的。但缺點是很多都是偽 對程式設計初學者來說有一些難度,甚至有些考研的同學來看這本書有很多還看不懂,並且裡面也有些容易迷惑人的地方。出於...