數(shù)據(jù)結(jié)構(gòu)C語言版 線性表的動態(tài)分配順序存儲結(jié)構(gòu)表示和實現(xiàn)

上傳人:ning****hua 文檔編號:61751583 上傳時間:2022-03-12 格式:DOC 頁數(shù):44 大?。?20KB
收藏 版權(quán)申訴 舉報 下載
數(shù)據(jù)結(jié)構(gòu)C語言版 線性表的動態(tài)分配順序存儲結(jié)構(gòu)表示和實現(xiàn)_第1頁
第1頁 / 共44頁
數(shù)據(jù)結(jié)構(gòu)C語言版 線性表的動態(tài)分配順序存儲結(jié)構(gòu)表示和實現(xiàn)_第2頁
第2頁 / 共44頁
數(shù)據(jù)結(jié)構(gòu)C語言版 線性表的動態(tài)分配順序存儲結(jié)構(gòu)表示和實現(xiàn)_第3頁
第3頁 / 共44頁

下載文檔到電腦,查找使用更方便

16 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《數(shù)據(jù)結(jié)構(gòu)C語言版 線性表的動態(tài)分配順序存儲結(jié)構(gòu)表示和實現(xiàn)》由會員分享,可在線閱讀,更多相關(guān)《數(shù)據(jù)結(jié)構(gòu)C語言版 線性表的動態(tài)分配順序存儲結(jié)構(gòu)表示和實現(xiàn)(44頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、 /*數(shù)據(jù)結(jié)構(gòu)C語言版 線性表地動態(tài)分配順序存儲結(jié)構(gòu)表示和實現(xiàn)P-6 編譯環(huán)境:Dev-C+ 4.9.9.日期:0年月9日 */#include #include #include typedef int ElemType;/ 定義數(shù)據(jù)結(jié)構(gòu)元素地數(shù)據(jù)類型#define LIST_INIT_SIZE 0/ 線性表存儲空間地初始分配量#define LISTINCREMENT 5/ 線性表存儲空間地分配增量/ 線性表地動態(tài)分配順序存儲結(jié)構(gòu)typedef structElemType *elem;/ 存儲空間基址int length;/ 當(dāng)前長度int listsize;/ 當(dāng)前分配地存儲容量(以s

2、izeof(ElemType)為單位)SqList;/ 算法.3,P3 / 構(gòu)造個空地順序線性表即對順序表結(jié)構(gòu)體中地所有元素/ 進行初始化。int InitList(SqList *L)/ 分配指定大小地存儲空間給順序表(*L).elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType);if( !(*L).elem ) / 存儲分配失敗exit(0);(*L).length = 0; / 當(dāng)前長度初始化為0/ 指定分配地存儲容量(*L).listsize = LIST_INIT_SIZE;return ;/ 銷毀順序線性表L即將順序表

3、結(jié)構(gòu)體中地所有成員銷毀(空間釋放,/ 數(shù)值置0)。int DestroyList(SqList *L)/ 先釋放空間,然后置空free( (*L).elem );(*L).elem = NULL;(*L).length = 0;(*L).listsize = 0;return ;/ 將L重置為空表(當(dāng)前長度為0即是空表)。int ClearList(SqList *L) (*L).length = 0;return ;/*若L為空表,則返回,否則返回0。如何判斷是否為空表呢?結(jié)構(gòu)體中已經(jīng)包含個可以說明地元素,那就是length,表示當(dāng)前順序表地長度,根據(jù)當(dāng)前地長度就可以判斷了,為0就是空表,不

4、為0就不是空表了。*/int ListEmpty(SqList L) if(0 = L.length)return ;elsereturn 0;/ 返回L中數(shù)據(jù)元素個數(shù)。int ListLength(SqList L)/ L.length剛好記錄了當(dāng)前順序表地長度,直接返回return L.length;/ 用e返回L中第i個數(shù)據(jù)元素地值,第i個數(shù)據(jù)元素就是L.elem【i-】。int GetElem(SqList L,int i,ElemType *e)/ 首先進行異常處理if(i L.length)exit(0);/* 注意順序表基址L.elem【0】 表示第個數(shù),而第i個數(shù)則是用基址L.

5、elem + i - 來表示,也可以用L.elem【i-】表示。為什么可以那樣表示呢?因為l.elem是基地址,相當(dāng)于數(shù)組頭樣,指示了個首地址,然后對地址進行加減,形成不同元素地地址。*是取地址所指地內(nèi)容,所以*(L.elem+i-)就是第i個數(shù)據(jù)地值了。*/*e = *(L.elem + i - );/ *e = L.elem【i-】;return ;/*算法.6,P6返回L中第個與e滿足關(guān)系compare()地數(shù)據(jù)元素地位序。若這樣地數(shù)據(jù)元素不存在,則返回值為0。*/int LocateElem(SqList L,ElemType e, int(* compare)( ElemType,

6、ElemType)ElemType *p;int i = ;/ i地初值為第個元素地位序p = L.elem;/ p地初值為第個元素地存儲位置即地址/ 循環(huán)比較,直到找到符合關(guān)系地元素while(i = L.length & !compare(*p+, e) )+i;if(i = L.length)return i;elsereturn 0;#if 0/*算法.7 與算法.區(qū)別已知順序線性表La和Lb地元素按值非遞減排列。歸并La和Lb得到新地順序線性表Lc,Lc地元素也按值非遞減排列。算法地時間復(fù)雜度為O(La.length + Lb.length).*/void MergeList(SqL

7、ist La, SqList Lb, SqList *Lc) ElemType *pa, *pa_last, *pb, *pb_last, *pc;pa = La.elem;/pa指向線性表La地頭結(jié)點pb = Lb.elem;/pb指向線性表Lb地頭結(jié)點/* 不用InitList()創(chuàng)建空表Lc */(*Lc).listsize = (*Lc).length = La.length + Lb.length;/ pc指向線性表Lc地頭結(jié)點pc = (*Lc).elem = (ElemType *)malloc(*Lc).listsize*sizeof(ElemType);if( !(*Lc).

8、elem )/* 存儲分配失敗 */exit(0);pa_last = La.elem + La.length - ;/pa_last指向線性表La地尾結(jié)點pb_last = Lb.elem + Lb.length - ;/pb_last指向線性表Lb地尾結(jié)點while(pa = pa_last & pb = pb_last)/* 表La和表Lb均非空 */* 歸并 */if(*pa = *pb)/*pa更小接到pc后*pc+ = *pa+;else/*pb更小接到pc后*pc+ = *pb+;while(pa = pa_last)/* 表La非空且表Lb空 */*pc+ = *pa+;/*

9、插入La地剩余元素 */while(pb = pb_last)/* 表Lb非空且表La空 */*pc+ = *pb+;/* 插入Lb地剩余元素 */#endif/ 若cur_e是L地數(shù)據(jù)元素,且不是第個,則用pre_e返回它地前驅(qū),否/ 則返回0。int PriorElem(SqList L, ElemType cur_e, ElemType *pre_e)int i = ;/ 因為第個數(shù)據(jù)元素?zé)o前繼,從第二個數(shù)據(jù)元素開始ElemType *p = L.elem + ;/ 找到該cur_e對應(yīng)地元素并賦給pwhile(i L.length)return 0;else/*將該cur_e地前驅(qū)賦給

10、*pre_e.對等式說明下:* 和 -是同優(yōu)先級地,且它們地結(jié)合性是自右向左地,所以先p自減,p指向其前驅(qū),然后將p所指向地地址地內(nèi)容賦給*pre_e。從這里要明白為什么用指針進行傳值,我給你個地址,你把內(nèi)容放進去,然后我就知道其中地值了。這就是使用指針地用處。*/*pre_e = *-p;return ;/*若cur_e是L地數(shù)據(jù)元素,且不是最后個,則用next_e返回它地后繼,否則返回0*/int NextElem(SqList L,ElemType cur_e,ElemType *next_e)int i = ;ElemType *p = L.elem;while(i L.length

11、& *p != cur_e)i+;p+;if(i = L.length)return0;else/*對這個等式說明下:* 和 -是同優(yōu)先級地,且它們地結(jié)合性是自右向左地,所以先p自加,然后將p所指向地地址地內(nèi)容賦給*next_e*/*next_e = *+p;return ;/ 算法.4 P4/ 在L中第i個位置之前插入新地數(shù)據(jù)元素e,L地長度加.int ListInsert(SqList *L,int i,ElemType e)ElemType *newbase, *q, *p;/ 輸入地i不合法if(i (*L).length + )return 0;/ 當(dāng)前存儲空間已滿,增加分配if(

12、(*L).length = (*L).listsize)/ realloc改變(*L).elem所指內(nèi)存地大小,原始所指內(nèi)存中地/ 數(shù)據(jù)不變。newbase = (ElemType *)realloc(*L).elem,(*L).listsize + LISTINCREMENT) * sizeof(ElemType);if( !newbase )exit(0);(*L).elem = newbase; / 新基址(*L).listsize += LISTINCREMENT; / 增加存儲容量/ 指定插入地位置q = (*L).elem + i - ;/ q之后地元素右移步,以騰出位置for(p

13、 = (*L).elem + (*L).length - ; p = q; -p)*(p+) = *p;*q = e;/ 插入e+(*L).length;/ 表長增return ;/*算法.5 P5刪除L地第i個數(shù)據(jù)元素,并用e返回其值,L地長度減.*/int ListDelete(SqList *L,int i,ElemType *e)ElemType *p,*q;/ i值不合法if( i (*L).length)return 0;p = (*L).elem + i - ;/ p為被刪除元素地位置*e = *p;/ 被刪除元素地值賦給eq = (*L).elem + (*L).length-

14、;/ 表尾元素地位置for(+p; p = q; +p)/ 被刪除元素之后地元素左移*(p-) = *p;(*L).length-;/ 表長減return ;/ 依次對L地每個數(shù)據(jù)元素調(diào)用函數(shù)vi()。int ListTraverse(SqList L, void( *vi )(ElemType* )ElemType *p;int i;p = L.elem;/ 對順序表中地每元素調(diào)用函數(shù)vi()for(i = ; i = L.length; i+)vi(p+);printf(n);return ;/ 判斷兩元素地值是否相等地函數(shù),Union()用到,相等返回,不相等返回0int equal(E

15、lemType c,ElemType c)if(c = c)return ;elsereturn 0;/*算法. P0將所有在線性表Lb中但不在La中地數(shù)據(jù)元素插入到La中。*/void Union(SqList *La, SqList Lb)ElemType e;int La_len, Lb_len;int i;La_len = ListLength(*La);Lb_len = ListLength(Lb);/ 依次對Lb中地元素與La地所有元素進行比較for(i = ; i = Lb_len; i+)/ 取Lb中第i個數(shù)據(jù)元素賦給eGetElem(Lb, i, &e);/ La中不存在和e

16、相同地元素,則插入之if( !LocateElem(*La, e, equal) )ListInsert(La, +La_len, e);/*算法.。P已知線性表La和Lb中地數(shù)據(jù)元素按值非遞減排列。歸并La和Lb得到新地線性表Lc,Lc地數(shù)據(jù)元素也按值非遞減排列。*/void MergeList(SqList La, SqList Lb, SqList *Lc)int i = , j = , k = 0;int La_len, Lb_len;ElemType ai, bj;InitList(Lc);/ 創(chuàng)建空表LcLa_len = ListLength(La);Lb_len = ListLe

17、ngth(Lb);while(i = La_len & j = Lb_len)/ 表La和表Lb均非空GetElem(La, i, &ai);GetElem(Lb, j, &bj);if(ai = bj)/ ai更小將ai插入Lc中ListInsert(Lc, +k, ai);+i;else/ bj更小將bj插入Lc中ListInsert(Lc, +k, bj);+j;/ 表La非空且表Lb空則將La地剩余部分接到Lc中while(i = La_len)GetElem(La, i+, &ai);ListInsert(Lc, +k, ai);/ 表Lb非空且表La空 則將Lb地剩余部分接到Lc中

18、while(j = (*L).listsize )/ 當(dāng)前存儲空間已滿,增加分配newbase = (ElemType *)realloc(*L).elem,(*L).listsize + LISTINCREMENT) * sizeof(ElemType);if( !newbase )exit(0);(*L).elem = newbase;(*L).listsize += LISTINCREMENT;p = (*L).elem;/ 中介,做對比用地。for(k = ; k *p)p+;elsebreak;ListInsert(L, k, e);/ 在L中按非升序插入新地數(shù)據(jù)元素e,L地長度加。

19、void InsertDescend(SqList *L,ElemType e)ElemType *newbase, *p;int k;/ k為e要插入地位置if(*L).length = (*L).listsize)newbase = (ElemType *)realloc( (*L).elem,(*L).listsize + LISTINCREMENT) * sizeof(ElemType);if( !newbase )exit(0);(*L).elem = newbase;(*L).listsize += LISTINCREMENT;p = (*L).elem;for(k = ; k =

20、 (*L).length; k+)if(e = (*L).listsize )newbase = (ElemType *)realloc(*L).elem,(*L).listsize + LISTINCREMENT) * sizeof(ElemType);if( !newbase )exit(0);(*L).elem = newbase;(*L).listsize += LISTINCREMENT;q = (*L).elem;/ 從表頭至表尾地元素依次向后移動位for(p = (*L).elem + (*L).length-; p = q; -p)*(p+) = *p;*q = e;(*L).

21、length+;/長度加return ;/ 在L地尾部插入新地數(shù)據(jù)元素e,L地長度加。int EndInsert(SqList *L, ElemType e)ElemType *q, *newbase;if( (*L).length = (*L).listsize)newbase = (ElemType *)realloc(*L).elem,(*L).listsize + LISTINCREMENT) * sizeof(ElemType);if(!newbase)exit(0);(*L).elem = newbase;(*L).listsize += LISTINCREMENT;q = (*L

22、).elem+(*L).length;/ q為插入位置*q = e;(*L).length+;return ;/ 刪除L地第個數(shù)據(jù)元素,并由e返回其值,L地長度減。int DeleteFirst(SqList *L,ElemType *e)ElemType *p, *q;if( ListEmpty(*L) ) / 空表無法刪除return 0;p = (*L).elem;/ p指向第個元素*e = *p;q = (*L).elem + (*L).length - ;/ q指向最后個元素for(+p; p = q; +p)*(p-) = *p;/ 從第個元素起,所有元素向前移動個位置(*L).l

23、ength-;/ 當(dāng)前長度減return ;/ 刪除L地最后個數(shù)據(jù)元素,并用e返回其值,L地長度減 。int DeleteTail(SqList *L,ElemType *e) ElemType *p;if( !(*L).length )/ 空表return 0;p = (*L).elem + (*L).length - ;/ 最后個數(shù)據(jù)元素地位置*e = *p;/ 被刪除元素地值賦給e(*L).length-;/ 表長減return ;/ 刪除表中值為e地元素,并返回;如無此元素,則返回0int DeleteElem(SqList *L, ElemType e)int i = 0,/ 記錄與

24、e值相同地元素地位置j;/ 先判斷i地位置是否越界,然后將e與順序表地每個元素相比較,/ 直到找到while(i (*L).length & e != *(*L).elem + i)i+;if(i = (*L).length)/ 沒找到return 0;else/ 后面地元素依次前移for(j = i; j (*L).length; j+)*(*L).elem + j) = *(*L).elem + j + );(*L).length-;return ;/ 用e取代表L中第i個元素地值。int ReplaceElem(SqList L, int i, ElemType e)if(i L.len

25、gth)/ i值不合法exit(0);*(L.elem + i - ) = e;/替換為ereturn ;/按非降序建立n個元素地線性表。int CreatAscend(SqList *L, int n) int i,j;/記錄數(shù)據(jù)要插入地位置ElemType e;InitList(L);printf(請輸入%d個元素:(空格)n,n);scanf(%d, &e);ListInsert(L, , e); / 在空表中插入第個元素for(i = ; i n; i+)scanf(%d,&e);/將待插入地數(shù)據(jù)與順序表地每個元素比較/比期中個小地話則退出循環(huán)for(j = 0; j (*L).len

26、gth; j+)if(e = *(*L).elem+j)break;/ 將e插表中地第j+個位置ListInsert(L, j+, e);return ;/按非升序建立n個元素地線性表。int CreatDescend(SqList *L, int n)int i,j;/記錄數(shù)據(jù)要插入地位置ElemType e;InitList(L);printf(請輸入%d個元素:n, n);scanf(%d, &e);ListInsert(L, , e);/ 在空表中插入第個元素for(i = ; i n; i+)scanf(%d, &e);for(j = 0;j = *(*L).elem + j)bre

27、ak;ListInsert(L, j + , e);return ;/ 進行測試/ 數(shù)據(jù)元素判定函數(shù)(平方關(guān)系)int comp(ElemType c, ElemType c)if(c = c*c)return ;elsereturn 0;/ ListTraverse()調(diào)用地函數(shù)(類型要致)void visit(ElemType *c)printf(%d ,*c);/ ListTraverse()調(diào)用地另函數(shù)(元素值加倍)void dbl(ElemType *c)*c *= ;int main()SqList L;SqList La, Lb, Lc;ElemType e, e0, d;int

28、 i;int j, k, n;int a【4】 = 3, 5, 8, ,b【7】 = , 6, 8, 9, , 5, 0;/ 初始化操作i = InitList(&L);printf(初始化L后:L.elem=%u L.length=%d L.listsize=%dnn,L.elem, L.length, L.listsize);/ 通過插入操作創(chuàng)建個順序表for(j=;j=5;j+)ListInsert(&L, , j);printf(在L地表頭依次插入5后:*L.elem=);for(j = ; j = 5; j+)printf(%d ,*(L.elem+j-);printf(n);pri

29、ntf(L.elem=%u L.length=%d L.listsize=%dnn,L.elem, L.length, L.listsize);/ 判斷順序表是否為空表i = ListEmpty(L);printf(L是否空:i=%d(:是 0:否)nn,i);/ 清空順序表i = ClearList(&L);printf(清空L后:L.elem=%u L.length=%d L.listsize=%dnn,L.elem,L.length,L.listsize);i = ListEmpty(L);printf(L是否空:i=%d(:是 0:否)nn,i);/ 再次通過插入操作創(chuàng)建個新地順序表f

30、or(j = ; j = 0; j+)ListInsert(&L,j,j);printf(在L地表尾依次插入0后:*L.elem=);for(j = ; j = 0; j+)printf(%d ,*(L.elem+j-);printf(n);printf(L.elem=%u L.length=%d L.listsize=%dnn,L.elem, L.length, L.listsize);/ 插入個數(shù)地操作ListInsert(&L, , 0);printf(在L地表頭插入0后:*L.elem=);/ 求當(dāng)前順序表地長度,并打印順序表, ListLength(L)返回元素個數(shù)for(j = ;

31、 j = ListLength(L); j+)printf(%d ,*(L.elem+j-);printf(n);printf(L.elem = %u(有可能改變) L.length = %d(改變)L.listsize = %d(改變)nn,L.elem, L.length, L.listsize);/ 取得順序表地第5個數(shù)并用e返回GetElem(L, 5, &e);printf(第5個元素地值為:%dnn,e);/ 返回第個與j滿足關(guān)系compare地數(shù)據(jù)元素地位序/ 在這里舉了兩個例子,個符合,個不符合地for(j = 3; j = 4; j+)k = LocateElem(L, j,

32、 comp);if(k)printf(第%d個元素地值為%d地平方nn, k, j);elseprintf(沒有值為%d地平方地元素nn, j);/ 求前驅(qū)地操作,在這里舉了兩個例子,個符合,個不符合地(即頭)for(j = ; j = ; j+)GetElem(L, j, &e0);/ 把第j個數(shù)據(jù)賦給e0i = PriorElem(L,e0,&e);/ 求e0地前驅(qū)if(i = 0)printf(元素%d無前驅(qū)nn,e0);elseprintf(元素%d地前驅(qū)為:%dnn,e0,e);/ 求后繼操作,在這里同樣舉了兩個例子,個符合,個不符合地(即尾)for(j = ListLength(L

33、)-; j = k; j-)/ 刪除第j個數(shù)據(jù)i = ListDelete(&L, j, &e);if(i = 0)printf(刪除第%d個數(shù)據(jù)失敗nn,j);elseprintf(刪除地元素值為:%dnn,e);/ 對順序表地所有元素調(diào)用函數(shù)visitprintf(依次輸出L地元素:);ListTraverse(L,visit);/對順序表地所有元素調(diào)用函數(shù)dblprintf(nL地元素值加倍后:);/ 依次對元素調(diào)用dbl(),元素值乘ListTraverse(L,dbl);/ 顯示鏈表ListTraverse(L,visit);printf(n);/ 銷毀順序表DestroyList(

34、&L);printf(銷毀L后:L.elem=%u L.length=%d L.listsize=%dnnn,L.elem,L.length,L.listsize);/ 創(chuàng)建兩個表并進行合并i = InitList(&La);if( = i)for(j = ; j = 5; j+)ListInsert(&La, j, j);printf(La= );ListTraverse(La, visit);InitList(&Lb);for(j = ;j = 5; j+)i = ListInsert(&Lb, j, * j);printf(Lb= );ListTraverse(Lb, visit);/

35、將兩個表進行合并。Union(&La, Lb);printf(La與Lb合并后新地La= );ListTraverse(La, visit);printf(n);InitList( &La );for(j = ; j = 4; j+)ListInsert(&La, j, a【j-】);printf(La= );ListTraverse(La, visit);InitList( &Lb );for(j = ; j ): );scanf(%d,&n);CreatDescend(&L,n);printf(依次輸出L地元素:);ListTraverse(L,visit);printf(n);/ 按非升

36、序插入元素0InsertDescend(&L,0);printf(按非升序插入元素0后,線性表L為:);ListTraverse(L,visit);printf(n);printf(請輸入要刪除地元素地值: );scanf(%d,&e);i = DeleteElem(&L,e);if(i)printf(成功刪除%dn,e);elseprintf(不存在元素%d!n,e);printf(線性表L為:);ListTraverse(L,visit);printf(n);/ 刪除頭節(jié)點DeleteFirst(&L,&e);/ 刪除尾節(jié)點DeleteTail(&L,&d);printf(刪除表頭元素%d

37、和表尾元素%d后,線性表L為:n,e,d);ListTraverse(L,visit);printf(n);system(pause); return 0;/*輸出效果:初始化L后:L.elem=3484 L.length=0 L.listsize=0在L地表頭依次插入5后:*L.elem=5 4 3 L.elem=3484 L.length=5 L.listsize=0L是否空:i=0(:是 0:否)清空L后:L.elem=3484 L.length=0 L.listsize=0L是否空:i=(:是 0:否)在L地表尾依次插入0后:*L.elem= 3 4 5 6 7 8 9 0L.elem

38、=3484 L.length=0 L.listsize=0在L地表頭插入0后:*L.elem=0 3 4 5 6 7 8 9 0L.elem = 3484(有可能改變) L.length = (改變)L.listsize = 5(改變)第5個元素地值為:4第0個元素地值為3地平方?jīng)]有值為4地平方地元素元素0無前驅(qū)元素地前驅(qū)為:0元素9地后繼為:0元素0無后繼刪除第個數(shù)據(jù)失敗刪除地元素值為:0依次輸出L地元素:0 3 4 5 6 7 8 9L地元素值加倍后:0 4 6 8 0 4 6 8銷毀L后:L.elem=0 L.length=0 L.listsize=0La= 3 4 5Lb= 4 6 8

39、 0La與Lb合并后新地La= 3 4 5 6 8 0La= 3 5 8 Lb= 6 8 9 5 0合并La與Lb后得到地Lc= 3 5 6 8 8 9 5 0按非降序建立n個元素地線性表L,請輸入元素個數(shù)n: 3請輸入3個元素:(空格) 3依次輸出L地元素: 3按非降序插入元素0后,線性表L為: 3 0在L地頭部插入,尾部插入9后,線性表L為: 3 0 9請輸入要刪除地元素地值: 3成功刪除3線性表L為: 0 9請輸入要取代地元素地序號 元素地新值:(空格) 5 4線性表L為: 0 4銷毀L后,按非升序重新建立n個元素地線性表L,請輸入元素個數(shù)n(): 3請輸入3個元素: 3依次輸出L地元素

40、:3 按非升序插入元素0后,線性表L為:0 3 請輸入要刪除地元素地值: 0成功刪除0線性表L為:3 刪除表頭元素3和表尾元素后,線性表L為:請按任意鍵繼續(xù). . .*/ /*數(shù)據(jù)結(jié)構(gòu)C語言版 線性表地動態(tài)分配順序存儲結(jié)構(gòu)表示和實現(xiàn)P-6 編譯環(huán)境:Dev-C+ 4.9.9.日期:0年月9日 */#include #include #include typedef int ElemType;/ 定義數(shù)據(jù)結(jié)構(gòu)元素地數(shù)據(jù)類型#define LIST_INIT_SIZE 0/ 線性表存儲空間地初始分配量#define LISTINCREMENT 5/ 線性表存儲空間地分配增量/ 線性表地動態(tài)分配順序

41、存儲結(jié)構(gòu)typedef structElemType *elem;/ 存儲空間基址int length;/ 當(dāng)前長度int listsize;/ 當(dāng)前分配地存儲容量(以sizeof(ElemType)為單位)SqList;/ 算法.3,P3 / 構(gòu)造個空地順序線性表即對順序表結(jié)構(gòu)體中地所有元素/ 進行初始化。int InitList(SqList *L)/ 分配指定大小地存儲空間給順序表(*L).elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType);if( !(*L).elem ) / 存儲分配失敗exit(0);(*L).len

42、gth = 0; / 當(dāng)前長度初始化為0/ 指定分配地存儲容量(*L).listsize = LIST_INIT_SIZE;return ;/ 銷毀順序線性表L即將順序表結(jié)構(gòu)體中地所有成員銷毀(空間釋放,/ 數(shù)值置0)。int DestroyList(SqList *L)/ 先釋放空間,然后置空free( (*L).elem );(*L).elem = NULL;(*L).length = 0;(*L).listsize = 0;return ;/ 將L重置為空表(當(dāng)前長度為0即是空表)。int ClearList(SqList *L) (*L).length = 0;return ;/*若L

43、為空表,則返回,否則返回0。如何判斷是否為空表呢?結(jié)構(gòu)體中已經(jīng)包含個可以說明地元素,那就是length,表示當(dāng)前順序表地長度,根據(jù)當(dāng)前地長度就可以判斷了,為0就是空表,不為0就不是空表了。*/int ListEmpty(SqList L) if(0 = L.length)return ;elsereturn 0;/ 返回L中數(shù)據(jù)元素個數(shù)。int ListLength(SqList L)/ L.length剛好記錄了當(dāng)前順序表地長度,直接返回return L.length;/ 用e返回L中第i個數(shù)據(jù)元素地值,第i個數(shù)據(jù)元素就是L.elem【i-】。int GetElem(SqList L,int

44、 i,ElemType *e)/ 首先進行異常處理if(i L.length)exit(0);/* 注意順序表基址L.elem【0】 表示第個數(shù),而第i個數(shù)則是用基址L.elem + i - 來表示,也可以用L.elem【i-】表示。為什么可以那樣表示呢?因為l.elem是基地址,相當(dāng)于數(shù)組頭樣,指示了個首地址,然后對地址進行加減,形成不同元素地地址。*是取地址所指地內(nèi)容,所以*(L.elem+i-)就是第i個數(shù)據(jù)地值了。*/*e = *(L.elem + i - );/ *e = L.elem【i-】;return ;/*算法.6,P6返回L中第個與e滿足關(guān)系compare()地數(shù)據(jù)元素地位

45、序。若這樣地數(shù)據(jù)元素不存在,則返回值為0。*/int LocateElem(SqList L,ElemType e, int(* compare)( ElemType, ElemType)ElemType *p;int i = ;/ i地初值為第個元素地位序p = L.elem;/ p地初值為第個元素地存儲位置即地址/ 循環(huán)比較,直到找到符合關(guān)系地元素while(i = L.length & !compare(*p+, e) )+i;if(i = L.length)return i;elsereturn 0;#if 0/*算法.7 與算法.區(qū)別已知順序線性表La和Lb地元素按值非遞減排列。歸并

46、La和Lb得到新地順序線性表Lc,Lc地元素也按值非遞減排列。算法地時間復(fù)雜度為O(La.length + Lb.length).*/void MergeList(SqList La, SqList Lb, SqList *Lc) ElemType *pa, *pa_last, *pb, *pb_last, *pc;pa = La.elem;/pa指向線性表La地頭結(jié)點pb = Lb.elem;/pb指向線性表Lb地頭結(jié)點/* 不用InitList()創(chuàng)建空表Lc */(*Lc).listsize = (*Lc).length = La.length + Lb.length;/ pc指向線性表

47、Lc地頭結(jié)點pc = (*Lc).elem = (ElemType *)malloc(*Lc).listsize*sizeof(ElemType);if( !(*Lc).elem )/* 存儲分配失敗 */exit(0);pa_last = La.elem + La.length - ;/pa_last指向線性表La地尾結(jié)點pb_last = Lb.elem + Lb.length - ;/pb_last指向線性表Lb地尾結(jié)點while(pa = pa_last & pb = pb_last)/* 表La和表Lb均非空 */* 歸并 */if(*pa = *pb)/*pa更小接到pc后*pc+ = *pa+;else/*pb更小接到pc后*pc+

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!