馬上要找工作了,最近一段時間要複習下資料結構,在此處記些複習筆記,一與讀者共勉,二鼓勵自己堅持下去。
順序儲存的線性表結構定義如下:
typedef struct{<br />ElemType *elem;<br />int length;<br />int listsize;<br />}SqList;
首先要申請一塊兒連續的儲存空間,指定長度為0.
//線性表初始化<br />Status InitList(SqList *L)<br />{<br />(*L).elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));<br />if(!(*L).elem)<br />exit(OVERFLOW);<br />(*L).length = 0;<br />(*L).listsize = LIST_INIT_SIZE;<br />return OK;<br />}
銷毀線性表,這裡要注意的是要釋放儲存空間,同時特別注意將指標成員指標elem賦空,避免成為野指標。
//銷毀線性表<br />Status DestroyList(SqList *L)<br />{<br />free((*L).elem);<br />(*L).elem = NULL;//指標要賦空,避免出現野指標<br />(*L).length = 0;<br />(*L).listsize = 0;<br />return OK;<br />}
清空線性表的操作如下,只需把長度改成0就可以了
//清空線性表<br />Status ClearList(SqList *L)<br />{<br />(*L).length = 0;<br />return OK;<br />}
判斷線性表是否為空白
//判斷線性表是否為空白<br />Status ListEmpty(SqList L)<br />{<br />return L.length==0?TRUE:FALSE;<br />}
返回線性表的長度
//返回線性表的長度<br />Status ListLength(SqList L)<br />{<br />return L.length;<br />}
擷取指定位置的資料元素,只需要用儲存空間的基址加上**-1就可以了
//取出線性表指定位置的元素<br />Status GetElem(SqList L,int n,ElemType *e)<br />{<br />if(n>L.length||n<1)<br />exit(ERROR);<br />else<br />{<br />*e = L.elem[n-1];<br />}<br />return OK;<br />}
尋找某個指定元素的位置
//尋找某個指定元素的位置<br />int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType))<br />{<br />ElemType *p;<br />int i=1;<br />p = L.elem;<br />while(i<=L.length&&compare(*p++,e))<br />{<br />++i;<br />}<br />if(i<=L.length)<br />return i;<br />else<br />return 0;<br />}<br />//函數compare的實現<br />Status compare(int a,int b)<br />{<br />return (a-b);<br />}
返回指定元素的前驅
Status PriorElem(SqList L,ElemType cur_e,ElemType *pre_e)<br />{<br />int i = 2;//除第一個元素外,其他元素均有且只有一個前驅<br />ElemType *p = L.elem+1;<br />while(i<=L.length&&p!=cur_e)<br />{<br />p++;<br />i++;<br />}<br />if(i>L.length)<br />{<br />return INFEASIBLE;<br />}<br />else<br />{<br />*pre_e = *--p;<br />return OK;<br />}<br />}
返回指定元素的後繼
//返回指定元素的後繼<br />Status NextElem(SqList L,ElemType cur_e,ElemType *next_e)<br />{<br />int i = 1;<br />Elem *p = L.elem;<br />while(i<L.length&&p!=cur_e)<br />{<br />i++;<br />p++;<br />}<br />if(i==L.length)<br />return INFEASIBLE;<br />else<br />{<br />*next_e=*++p;<br />return OK;<br />}<br />}<br />
在指定位置插入一個元素
Status ListInsert(SqList *L,int i,ElemType e)<br />{<br />ElemType *newbase,*q,*p;<br />if(i<1||i>(*L).length+1)<br />{<br />return ERROR;<br />}<br />if((*L).length>=(*L).listsize)<br />{<br />newbase = (ElemType*)realloc((*L).elem,((*L).listsize+LISTINCREMENT)*sizeof(ElemType));<br />if(newbase)<br />exit(OVERFLOW);<br />(*L).elem = newbase;<br />(*L).listsize+=LISTINCREMENT;<br />}<br />q = (*L).elem+i-1;<br />for(p = (*L).elem+(*L).length-1;p>=q;--p)<br />*(p+1)=*p;//移動元素位置<br />*q = e;<br />++(*L).length;<br />return OK;<br />}
刪除某個指定位置的元素
Status ListDelete(SqList *L,int i,ElemType *e)<br />{<br />ElemType *p,*q;<br />if(i<1||i>(*L).length)<br />return ERROR;<br />p = (*L).elem+i-1;<br />*e = *p;<br />q = (*L).elem+(*L).length-1;<br />for(++p;p<=q;++p)<br />{<br />*(p-1)=*p;//順序前移該位置後面的元素<br />}<br />(*L).length--;<br />return OK;<br />}
遍曆線性表中的元素,visit就是調用了print
Status ListTraverse(Status L,void(*visit)(ElemType*))<br />{<br />ElemType *p;<br />int i;<br />p = L.elem;<br />for(i = 1;i<=L.length;i++)<br />{<br />visit(p++);<br />}<br />printf("/n");<br />return OK;<br />}<br />void print(ElemType *c)<br />{<br />printf("%d",*c);<br />}
合并兩個線性表
void MergeList(SqList La,SqList Lb,SqList *Lc)<br />{<br />int i = 1,j = 1,k = 0;<br />int La_len,Lb_len;<br />ElemType ai,bj;<br />Init(Lc);<br />La_len = ListLength(La);<br />Lb_len = ListLength(Lb);<br />while(i<=La_len&&j<=Lb_len)<br />{<br />GetElem(La,i,&ai);<br />GetElem(Lb,j,&bj);<br />if(ai<=bj)<br />{<br />ListInsert(Lc,++k,ai);<br />++i;<br />}<br />else<br />{<br />ListInsert(Lc,++k,bj);<br />++j;<br />}<br />}<br />while(i<=La_len)<br />{<br />GetElem(La,i++,&ai);<br />ListInsert(Lc,++k,ai);<br />}<br />while(j<=Lb_len)<br />{<br />GetElem(Lb,j++,&bj);<br />ListInsert(Lc,++k,bj);<br />}<br />}
基本操作就這麼多了,感覺順序儲存的線性表還是比較簡單的。稍微有點難度的就是最後的這個合并了。