剛開始學數據結構,幾乎算是什么都不會,想記錄一下學習的東西,所以就學別人開始寫博客。
剛學了順序存儲的線性表的基本操作,把操作寫了一遍。可能會有錯誤。
順序存儲的線性表,用結構體類型。注意:結構體並不是用來存儲元素的,elem才是存儲元素的首地址
1 typedef struct 2 { 3 ElemType *elem;//存儲空間基地址 6 int length;//表長 7 int listsize;//表容量 8 }SqList;
初始化:構造空表L,返回一個狀態,需要帶回一個表給基地址動態分配一定大小的空間,表長賦0,表容量賦值
注意:開辟內存失敗;
1 Status InitList_Sq(SqList &L)//L為結構體的一個變量,所以在使用它的成員時用L. 2 { 3 L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); 4 if(!L.elem) 5 exit(OVERFLOW); 6 L.length=0; 7 L.listsize=LIST_INIT_SIZE; 8 return OK; 9 }
創建表:先初始化,再依次輸入每個元素,返回狀態,傳一個表、輸入幾個數,帶回一個表
注意:每輸入一個表長+1 這里的輸入不通用,只能輸入整型數據。也可以用初始化和插入函數實現
1 Status CreaList_Sq(SqList &L,int n) 2 { 3 L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); 4 if(!L.elem) 5 exit(OVERFLOW); 6 L.length=0; 7 L.listsize=LIST_INIT_SIZE;//初始化 8 9 ElemType *p; 10 p=L.elem;//為了練習指針,所以多用 11 while(p<=L.elem+n-1) 12 { 13 scanf("%d",p);//p本身就是地址,與&*p含義相同; 14 L.length++; 15 p++;//別忘了 16 } 17 return OK; 18 19 }
銷毀表:返回狀態,傳一個表,帶回把空間釋放,表長和表容量賦0
注意:釋放空間
1 Status DestroyList_Sq(SqList &L) 2 { 3 free(L.elem); 4 L.elem=NULL; 5 L.length=0; 6 L.listsize=0; 7 return OK; 8 }
清空表:把表長賦0,返回狀態,帶回表區別於銷毀表
注意:
1 Status ClearList_Sq(SqList &L) 2 { 3 L.length=0; 4 return 0; 5 }
判空謂詞:返回狀態,傳入一個表,看表長
注意:
1 Status IsListEmpty(SqList L)
2 {
3 return L.length==0? TRUE:FALSE;
4 } (為什么不自動分行了)
表長:返回表中數據元素個數 傳一個表
注意:
int ListLength(SqList L) { return L.length; }
獲取第i個元素:返回狀態,傳一個表,位置,存第i個元素的變量,帶回該變量
注意:i的位置不合法
1 Status GetElem_Sq(SqList L,int i,ElemType &e) 2 { 3 if(i<1||i>L.length) 4 return ERROR;//正常人都從1開始數數 5 6 e=*(L.elem+i-1); 7 8 return OK; 9 10 }
查找:查找符合條件的第一個元素,返回它的位序傳一個表,要查的元素,一個函數指針
注意:
1 int LocateElem_Sq(SqList L,ElemType e,Status(*compare)(ElemType,ElemType)) 2 { 3 ElemType *p=L.elem; 4 int i=1;//記錄位置 5 while(p<=L.elem+L.length-1&&compare(*p,e)==FALSE)//或寫成(*compare)(*p,e); 6 { 7 p++; 8 i++; 9 } 10 if(p<=L.elem+L.length-1) 11 return i; 12 13 return ERROR; 14 }
寫一個函數指針對應的比較謂詞吧
1 Status IsEqual(ElemType a,ElemType e)
2 {
3 return a==e? TRUE:FALSE;
4 }
元素的前驅:找到第一個該元素,如果不是第一個,就帶回它的前驅返回狀態,傳一個表,一個元素,一個帶回元素的變量
注意:第一個元素
Status PriorElem_Sq(SqList L,ElemType cur_e,ElemType &pre_e) { int i=1; ElemType *p=L.elem; while(i<=L.length&&*p!=cur_e) { p++; i++; } if(i!=1&&i<=L.length) { pre_e=*(L.elem+i-2); return OK; } return ERROR; }
元素的后繼:帶回一個元素的后一個返回一個狀態,傳一個表,一個該元素,一個帶回元素的變量
注意:最后一個元素
Status NextElem_Sq(SqList L,ElemType cur_e,ElemType &nex_e) { ElemType *p=L.elem; int i=1; while(i<=L.length&&*p!=cur_e) { p++; i++; } if(i<L.length) { nex_e=*(L.elem+i);//注意帶回的是誰 } return ERROR; }
插入:在第i個元素前插入一個元素返回狀態,傳入一個表,位置i,元素,帶回一個表
注意:i的位置不合法,表長+1,表滿擴容
Status ListInsert_Sq(SqList &L,int i,ElemType e) { if(i<=0||i>L.length+1) return ERROR; if(L.length>=L.listsize) { L.elem=(ElemType *)realloc(L.elem,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(ElemType)); if(!L.elem) exit(OVERFLOW); L.listsize+=LISTINCREMENT; }//擴容 for(int j=L.length;j>=i;--j) *(L.elem+j)=*(L.elem+j-1);//第i個元素后移 *(L.elem+i-1)=e; L.length++; return OK; }
刪除:輸出第i個元素,並帶回它返回狀態,傳一個表,位置i,一個帶回元素的變量,帶回表
注意:i的位置,表長-1,帶回元素
1 Status ListDelete_Sq(SqList &L,int i,ElemType &e) 2 { 3 if(i<1||i>L.length) 4 return ERROR; 5 6 e=*(L.elem+i-1); 7 8 for(int j=i;j<L.length;++j)//注意結束位置是到數第二個 9 { 10 *(L.elem+j-1)=*(L.elem+j); 11 } 12 13 --L.length; 14 15 return OK; 16 }
遍歷:依次對表中的元素執行一個傳入的操作,如果執行失敗就返回錯誤返回狀態,傳一個表和函數指針
注意:空表
1 Status ListTraverse(SqList L,Status (*vist)(ElemType)) 2 { 3 if(!L.length) 4 return ERROR; 5 6 ElemType *p=L.elem; 7 while(p<=L.elem+L.length-1) 8 { 9 if(!vist(*p))//或者(*vist)(*p); 10 return ERROR; 11 p++; 12 } 13 14 return OK; 15 16 }
寫一個與函數指針對應的
1 Status Print_e(ElemType e)
2 {
3 printf("%d ",e);
4} (或許只要一句話就會這樣)
