線性順序表——數(shù)據(jù)結(jié)構(gòu)_第1頁
線性順序表——數(shù)據(jù)結(jié)構(gòu)_第2頁
線性順序表——數(shù)據(jù)結(jié)構(gòu)_第3頁
線性順序表——數(shù)據(jù)結(jié)構(gòu)_第4頁
線性順序表——數(shù)據(jù)結(jié)構(gòu)_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、/頭文件#include <stdio.h>#include <stdlib.h>/預定義常量和類型:函數(shù)結(jié)果狀態(tài)代碼#define OK 1#define ERROR 0#define TURE 1#define FALSE 0 #define INFEASIBLE -1#define OVERFLOW -2/-線性表的動態(tài)分配順序存儲結(jié)構(gòu)-#define LIST_INIT_SIZE 100 /線性表存儲空間的初始分配量#define LINSTINCREMENT 10 /線性表存儲空間的分配增量/數(shù)據(jù)類型說明,其值是函數(shù)結(jié)果狀態(tài)代碼typedef int Stat

2、us;typedef int ElemType;typedef struct ElemType *elem; /存儲空間基址int length; /當前長度int listsize; /當前分配的存儲容量(以sizeof(ElemType)為單位SqList; /定義了一個線性表的數(shù)據(jù)類型/-函數(shù)基本操作-/ 函數(shù)InitList的主要功能是初始化一個線性表,構(gòu)造一個空的線性表L。Status InitList(SqList &L) L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType); if(!L.elem) print

3、f("分配失敗n"); exit(OVERFLOW); /存儲分配失敗 L.length=0; /空表長度為0L.listsize=LIST_INIT_SIZE; /初始存儲容量return OK; /InitList/函數(shù)Exist的主要功能是判斷線性表L是否存在。Status exist(SqList &L) if(L.elem!=NULL)&&(L.listsize>=LIST_INIT_SIZE) /檢測線性表是否存在 return OK; else return ERROR;/若線性表存在返回OK,否則返回ERROR/函數(shù)Destro

4、yList的主要功能是銷毀線性表L。Status DestroyList(SqList &L)if(exist(L)/判斷線性表是否存在 free(L.elem); /釋放空間L.elem =NULL; /將指針賦值為空L.length=-1; /當前長度賦值為-1,標志線性表不存在L.listsize=0; /當前最大容量賦值為0return OK;elsereturn ERROR;/成功釋放空間時返回OK,否則返回ERROR/函數(shù)ClearList的主要功能是將L重置為空表。Status ClearList(SqList &L)if(!(L.elem=NULL) /重置為空

5、表return OK;else return ERROR;/重置線性表,成功返回OK,失敗返回ERROR/函數(shù)ListEmpty的主要功能是判斷線性表是否為空表。Status ListEmpty(SqList L) if(!exist(L) return ERROR; else if(ClearList(L) return TURE; else return FALSE; return OK;/函數(shù)ListLength的主要功能是檢測線性表的數(shù)據(jù)元素個數(shù)。 Status ListLength(SqList &L)/返回數(shù)據(jù)元素個數(shù)if(exist(L)/判斷線性表是否存在return

6、L.length ;/返回元素個數(shù)elsereturn -1;/檢驗線性表元素個數(shù),成功返回數(shù)字,失敗返回-1./函數(shù)GetElem的主要功能是返回線性表中指定位置的數(shù)據(jù)元素。 Status GetElem(SqList &L, int i, ElemType &e)/ 線性表已存在,用e返回線性表 L中第i個元素 if ( exist(L) && i > 0 && i < L.length+1) /判定線性表存在和元素位置 i是否合法e = L.elemi - 1; /將指定位置元素賦給ereturn OK; elsereturn

7、ERROR;/成功返回 OK, 失敗返回ERROR/函數(shù)compare的主要功能是判斷線性表中有與輸入元素相同的數(shù)值,函數(shù)默認程序compare(ElemType e1, ElemType e2) if(e1=e2)return OK; /相等,返回OKelsereturn ERROR;/不相等,返回ERROR /函數(shù)返回值是一個執(zhí)行成功與否的狀態(tài)標志/函數(shù)LocateElem的主要功能是返回滿足函數(shù)compare()的數(shù)據(jù)元素位序。int LocateElem(SqList L,ElemType e, Status(*compare)(ElemType,ElemType) int i; El

8、emType *p; i=1 ;/i的處值為第1個元素的位序 p=L.elem; /p的初值為第1個元素的存儲位置 while(i<=L.length&&!(*compare)(*p+,e)+i; if(i<=L.length) return i; else return ERROR; /在順序線性表L中查找第一個與e滿足compare()的元素的位序 /若找到,則返回其在L中的位序,否則返回ERROR/函數(shù)PriorElem的主要功能是返回指定元素的前驅(qū)。Status PriorElem(SqList L,ElemType cur_e,ElemType &

9、pre_e) int i=0; /初始化元素下標 while(i<L.length) /循環(huán)條件if(L.elemi=cur_e)/若L.elemi的元素值與cur_e相等if(i>0)/判斷i值是否合法 pre_e=L.elemi-1; return pre_e;/滿足條件,用pre_e返回元素cur_e前驅(qū)的值 else return -1; i+;/循環(huán)條件不滿足,繼續(xù)循環(huán)if(i>=L.length)return ERROR;/不滿足循環(huán)條件,無法繼續(xù)實行return OK;/操作成功,返回OK/返回給定元素的前驅(qū),成功則返回OK,由pre_e帶回前驅(qū)值,失敗則返回E

10、RROR/函數(shù)NextElem的主要功能是返回元素元素的后繼。Status NextElem(SqList L,ElemType cur_e,ElemType &next_e)int i=0;while(i<L.length)/循環(huán)條件if(L.elemi=cur_e)/若L.elemi的元素值與cur_e相等if(i!=L.length-1)/判斷i值是否合法 next_e=L.elemi+1; return next_e;/滿足條件,用next_e返回元素cur_e后繼的值 else return -1; i+;/循環(huán)條件不滿足,繼續(xù)循環(huán)if(i>=L.length)r

11、eturn ERROR;/不滿足循環(huán)條件,無法繼續(xù)實行return OK;/操作成功,返回1 /若cur_e是L的數(shù)據(jù)元素,且不是最后一個,則用next_e返回他的后繼,若失敗,則next_e無定義/函數(shù)visit的主要功能是判斷是依次輸出線性表的元素的值Status visit(ElemType e) printf("%d ",e); return OK;/輸出完成,返回OK/函數(shù)ListInsert的主要功能是向線性表中插入新的元素。Status ListInsert(SqList &L, int i, ElemType e)/參數(shù)L表示的是一個已經(jīng)初始化的線性

12、表變量/e表示待插入的數(shù)據(jù)/函數(shù)返回值是一個執(zhí)行成功與否的狀態(tài)標志 /i的合法值為1<=i<=ListLength_Sq(L)+1ElemType *newbase,*q,*p;if(i<1|i>L.length+1) return ERROR; /i值不合法if(L.length>=L.listsize) /當前存儲空間已滿,增加分配newbase=(ElemType *)realloc(L.elem,(L.listsize +LINSTINCREMENT)*sizeof(ElemType);if(!newbase)exit(OVERFLOW);/存儲分配失敗L

13、.elem=newbase;/新基址L.listsize+=LINSTINCREMENT;/增加存儲容量q=&(L.elem i-1); /q為插入位置 for(p=&(L.elemL.length-1);p>=q;-p) *(p+1)=*p; /插入位置及之后的元素后移*q=e; /插入e+L.length ;/表長增加1return OK;/插入成功,返回OK/ListInsert/函數(shù)ListDelete的主要功能是刪除線性表中的元素。Status ListDelete(SqList &L,int i,ElemType &e)/線性表L已存在且非空,

14、在順序線性表L中刪除第i個元素,并用e返回其值,L的長度-1 /i的合法值為1<=i<=LIstLength_Sq(L) ElemType *q,*p;if(i<1)|(i>L.length)return ERROR; /i值不合法p=&(L.elemi-1); /p為被刪除元素的位置 e=*p; /被刪除元素的值賦給e q=L.elem+L.length-1; /表尾元素的位置 for(+p;p<=q;+p) *(p-1)=*p; /被刪除之后的元素往前移 -L.length; /表長減一 return OK;/ListDelete/函數(shù)ListTrav

15、erse的主要功能是對每個元素調(diào)用visit()函數(shù)測試。Status ListTraverse(SqList L,Status(*visit)(ElemType) ElemType *p=L.elem; /p指向第1個元素 int i; for(i=1;i<=L.length;i+) /從表L的第1個元素到最后1個元素 visit(*p+); /對每個數(shù)據(jù)元素調(diào)用visit() return OK;/操作成功 /順序線性表L已存在,依次對L的每個數(shù)據(jù)元素調(diào)用函數(shù)visit(),一旦visit()失敗,則操作失敗int main()SqList L;ElemType e,cur_e,pr

16、e_e,next_e;int i,j,n;InitList(L);printf("輸入元素的個數(shù)為:");scanf("%d",&n);while(n<=0)/n的合法值為n>0printf("輸入錯誤,請重新輸入n");printf("輸入元素的個數(shù)為:");scanf("%d",&n);printf("請輸入%d個元素:",n);/輸入元素for(i=1;i<=n;i+)scanf("%d",&e);ListI

17、nsert(L,i,e);/調(diào)用函數(shù)ListInsert輸入/顯示線性表的元素個數(shù),依次顯示元素printf("線性表共有%d個元素,線性表中的元素依次為:",ListLength(L); for(i=0;i<n;i+) printf("%d ",L.elemi); printf("n");/函數(shù)GetElem的應(yīng)用,返回線性表L中第i個元素的值printf("請輸入要返回數(shù)據(jù)元素的位序:");scanf("%d",&i);while(i<1|i>L.length)/i

18、的合法值為0<i<L.length+1printf("輸入錯誤,請重新輸入n");printf("請輸入元素的序數(shù)為:");scanf("%d",&i);GetElem(L,i,e);printf("第%d個的元素的值為%dn",i,e);printf("n");/函數(shù)LocateElem和函數(shù)compare()的應(yīng)用,查找第一個與e滿足函數(shù)compare()的元素的位序 printf("請輸入數(shù)據(jù)元素e:");scanf("%d",&

19、amp;e);printf("第一個與e滿足關(guān)系的元素的位序為:%dn",LocateElem(L,e,(*compare); printf("n");/函數(shù)priorElem的應(yīng)用,輸出某數(shù)據(jù)元素的前驅(qū)printf("請輸入數(shù)據(jù)元素cur_e:");scanf("%d",&cur_e);if(PriorElem(L,cur_e,pre_e)!=-1) printf("%d的前驅(qū)為:%dn",cur_e,PriorElem(L,cur_e,pre_e);else printf("

20、;線性表L中沒有數(shù)據(jù)元素%d的前驅(qū)n",cur_e);printf("n");/函數(shù)NextElem的應(yīng)用,輸出某元素的后繼printf("請輸入數(shù)據(jù)元素cur_e:");scanf("%d",&cur_e);if(NextElem(L,cur_e,next_e)!=-1) printf("%d的后繼為:%dn",cur_e,NextElem(L,cur_e,next_e);else printf("線性表L中沒有數(shù)據(jù)元素%d的后繼n",cur_e);printf("

21、n");/函數(shù)ListInsert的應(yīng)用,插入元素printf("請輸入要插入的數(shù)據(jù)元素的位置i:");scanf("%d",&i); printf("請輸入要插入的數(shù)據(jù)元素e:");scanf("%d",&e); if(i>=1&&i<=L.length) ListInsert(L,i,e); printf("插入新的數(shù)據(jù)元素后的線性表L中的數(shù)據(jù)元素為:"); for(i=0;i<L.length;i+) printf("%d ",L.elemi); printf("n");printf("n");/函數(shù)ListDelete的應(yīng)用,刪除元素 printf("請輸入要刪除的數(shù)據(jù)元素的位置j:"); scanf("%d",&j); ListDelete(L,j,e); printf("刪除數(shù)據(jù)元素后的線性表L中的數(shù)據(jù)元素為:"); for(i=0;i<L.le

溫馨提示

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

評論

0/150

提交評論