順序表的建立與操作算法C語言實現(xiàn)_第1頁
順序表的建立與操作算法C語言實現(xiàn)_第2頁
順序表的建立與操作算法C語言實現(xiàn)_第3頁
順序表的建立與操作算法C語言實現(xiàn)_第4頁
順序表的建立與操作算法C語言實現(xiàn)_第5頁
免費預覽已結束,剩余1頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、順序表的建立與常用操作的算法(C語言實現(xiàn))#defineLIST_INIT_SIZE10/*線性表存儲空間的初始分配量*/*c2-1.h線性表的動態(tài)分配順序存儲結構*/#defineLISTINCREMENT2/*線性表存儲空間的分配增量*/typedefstructElemType*elem;/*存儲空間基址*/intlength;/*當前長度*/intlistsize;/*當前分配的存儲容量(以sizeof(ElemType)為單位)*/SqList;StatusInitList(SqList*L)/*操作結果:構造一個空的順序線性表*/(*L).elem=(ElemType*)mallo

2、c(LIST_INIT_SIZE*sizeof(ElemType);if(!(*L).elem)exit(OVERFLOW);/*存儲分配失敗*/(*L).length=0;/*空表長度為0*/(*L).listsize=LIST_INIT_SIZE;/*初始存儲容量*/returnOK;StatusDestroyList(SqList*L)/*初始條件:順序線性表L已存在。操作結果:銷毀順序線性表L*/free(*L).elem);(*L).elem=NULL;(*L).length=0;(*L).listsize=0;/*bo2-1.c順序表(存儲結構由c2-1.h定義)的基本操作(12個

3、)returnOK;StatusClearList(SqList*L)/*初始條件:順序線性表L已存在。操作結果:將L重置為空表*/(*L).length=0;returnOK;*/StatusListEmpty(SqListL)/*初始條件:順序線性表L已存在。操作結果:若L為空表,則返回TRUE否則返回FALSE*/if(L.length=0)returnTRUE;elsereturnFALSE;intListLength(SqListL)/*初始條件:順序線性表L已存在。操作結果:返回L中數(shù)據(jù)元素個數(shù)*/returnL.length;StatusGetElem(SqListL,inti,

4、ElemType*e)/*初始條件:順序線性表L已存在,1wiwListLength(L)*/*操作結果:用e返回L中第i個數(shù)據(jù)元素的值*/if(i<1|i>L.length)exit(ERROR);*e=*(L.elem+i-1);returnOK;intLocateElem(SqListL,ElemTypee,Status(*compare)(ElemType,ElemType)/*初始條件:順序線性表L已存在,compare。是數(shù)據(jù)元素判定函數(shù)(滿足為1,否則為0)*/*操作結果:返回L中第1個與e滿足關系compare()的數(shù)據(jù)元素的位序。*/*若這樣的數(shù)據(jù)元素不存在,則返

5、回值為0。算法2.6*/ElemType*p;inti=1;/*i的初值為第1個元素的位序*/p=L.elem;/*p的初值為第1個元素的存儲位置*/while(i<=L.length&&!compare(*p+,e)+i;if(i<=L.length)returni;elsereturn0;StatusPriorElem(SqListL,ElemTypecur_e,ElemType*pre_e)/*初始條件:順序線性表L已存在*/*操作結果:若cur_e是L的數(shù)據(jù)元素,且不是第一個,則用pre_e返回它的前驅,*/*否則操作失敗,pre_e無定義*/inti=2;

6、ElemType*p=L.elem+1;while(i<=L.length&&*p!=cur_e)p+;i+;if(i>L.length)returnINFEASIBLE;else*pre_e=*-p;returnOK;StatusNextElem(SqListL,ElemTypecur_e,ElemType*next_e)/*初始條件:順序線性表L已存在*/*操作結果:若cur_e是L的數(shù)據(jù)元素,且不是最后一個,則用next_e返回它的后繼,*/*否則操作失敗,next_e無定義*/inti=1;ElemType*p=L.elem;while(i<L.len

7、gth&&*p!=cur_e)i+;p+;Jif(i=L.length)returnINFEASIBLE;else*next_e=*+p;returnOK;StatusListInsert(SqList*L,inti,ElemTypee)/*初始條件:順序線性表L已存在,1WiWListLength(L)+1*/*操作結果:在L中第i個位置之前插入新的數(shù)據(jù)元素e,L的長度加1*/ElemType*newbase,*q,*p;if(i<1|i>(*L).length+1)/*i值不合法*/returnERROR;if(*L).length>=(*L).lists

8、ize)/*當前存儲空間已滿,增加分配*/newbase=(ElemType*)realloc(*L).elem,(*L).listsize+LISTINCREMENT)*sizeof(ElemType);if(!newbase)exit(OVERFLOW);/*存儲分配失敗*/(*L).elem=newbase;/*新基址*/(*L).listsize+=LISTINCREMENT;/*增加存儲容量*/q=(*L).elem+i-1;/*q為插入位置*/for(p=(*L).elem+(*L).length-1;p>=q;-p)/*插入位置及之后的元素右移*/*(p+1)=*p;*q=

9、e;/*插入e*/+(*L).length;/*表長增1*/returnOK;StatusListDelete(SqList*L,inti,ElemType*e)/*初始條件:順序線性表L已存在,1wiwListLength(L)*/*操作結果:刪除L的第i個數(shù)據(jù)元素,并用e返回其值,L的長度減1*/ElemType*p,*q;if(i<1|i>(*L).length)/*i值不合法*/returnERROR;p=(*L).elem+i-1;/*p為被刪除元素的位置*/*e=*p;/*被刪除元素的值賦給e*/q=(*L).elem+(*L).length-1;/*表尾元素的位置*/

10、for(+p;p<=q;+p)/*被刪除元素之后的元素左移*/*(p-1)=*p;(*L).length-;/*表長減1*/returnOK;StatusListTraverse(SqListL,void(*vi)(ElemType*)/*初始條件:順序線性表L已存在*/*操作結果:依次對L的每個數(shù)據(jù)元素調用函數(shù)vi()。一旦vi()失敗,則操作失敗*/*vi()的形參加'&',表明可通過調用vi()改變元素的值*/ElemType*p;inti;p=L.elem;for(i=1;i<=L.length;i+)vi(p+);printf("n&qu

11、ot;);returnOK;/*main2-1.c檢驗bo2-1.c的主程序*/#include"c1.h"typedefintElemType;#include"c2-1.h”#include"bo2-1.c”Statuscomp(ElemTypec1,ElemTypec2)/*數(shù)據(jù)兀素/Ute函數(shù)(平方關系)*/if(c1=c2*c2)returnTRUE;elsereturnFALSE;voidvisit(ElemType*c)/*ListTraverse()調用的函數(shù)(類型要,致)*/printf("%d",*c);voidd

12、bl(ElemType*c)/*ListTraverse()調用的另函數(shù)(兀素值加倍)*/*c*=2;voidmain()SqListL;ElemTypee,e0;Statusi;intj,k;i=InitList(&L);printf("初始化L后:L.elem=%uL.length=%dL.listsize=%dn",L.elem,L.length,L.listsize);for(j=1;j<=5;j+)i=ListInsert(&L,1,j);printf("在L的表頭依次插入15后:*L.elem=");for(j=1;j&

13、lt;=5;j+)printf("%d",*(L.elem+j-1);printf("n");printf("L.elem=%uL.length=%dL.listsize=%dn",L.elem,L.length,L.listsize);i=ListEmpty(L);printf("L是否空:i=%d(1:是0:否)n",i);i=ClearList(&L);printf("清空L后:L.elem=%uL.length=%dL.listsize=%dn",L.elem,L.length,

14、L.listsize);i=ListEmpty(L);printf("L是否空:i=%d(1:是0:否)n",i);for(j=1;j<=10;j+)ListInsert(&L,j,j);printf("在L的表尾依次插入110后:*L.elem=");for(j=1;j<=10;j+)printf("%d",*(L.elem+j-1);printf("n");printf("L.elem=%uL.length=%dL.listsize=%dn",L.elem,L.lengt

15、h,L.listsize);ListInsert(&L,1,0);printf("在L的表頭插入0后:*L.elem=");for(j=1;j<=ListLength(L);j+)/*ListLength(L)為元素個數(shù)*/printf("%d",*(L.elem+j-1);printf("n");printf("L.elem=%u(有可能改變)L.length=%d(改變)L.listsize=%d(改變)n",L.elem,L.length,L.listsize);GetElem(L,5,&

16、;e);printf("第5個元素的值為:%dn",e);for(j=3;j<=4;j+)k=LocateElem(L,j,comp);if(k)printf("第個元素的值為%d的平方n",k,j);elseprintf("沒有值為%d的平方的元素n",j);for(j=1;j<=2;j+)/*測試頭兩個數(shù)據(jù)*/GetElem(L,j,&e0);/*把第j個數(shù)據(jù)賦給e0*/i=PriorElem(L,e0,&e);/*求e0的前驅*/if(i=INFEASIBLE)printf("元素d無前驅n

17、",e0);elseprintf("元素d的前驅為:%dn",e0,e);for(j=ListLength(L)-1;j<=ListLength(L);j+)/*最后兩個數(shù)據(jù)*/GetElem(L,j,&e0);/*把第j個數(shù)據(jù)賦給e0*/i=NextElem(L,e0,&e);/*求e0的后繼*/if(i=INFEASIBLE)printf("元素d無后繼n",e0);elseprintf("元素d的后繼為:%dn",e0,e);k=ListLength(L);/*k為表長*/for(j=k+1;j>=k;j-)i=ListDelete(&L,j,&e);/*刪除第j個數(shù)據(jù)*/if(i=ERROR)printf("刪除第外數(shù)據(jù)失敗n",j);elseprintf("刪除的元素值為:dn",e);)printf("

溫馨提示

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

評論

0/150

提交評論