- // bo2-1.cpp 順序表示的線性表(存儲結構由c2-1.h定義)的基本操作(12個),包括算法2.3,2.4,2.5,2.6
- void InitList(SqList &L) // 算法2.3
- { // 操作結果:構造一個空的順序線性表L
- L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
- if(!L.elem)
- exit(OVERFLOW); // 存儲分配失敗
- L.length=0; // 空表長度爲0
- L.listsize=LIST_INIT_SIZE; // 初始存儲容量
- }
- void DestroyList(SqList &L)
- { // 初始條件:順序線性表L已存在。操作結果:銷燬順序線性表L
- free(L.elem);
- L.elem=NULL;
- L.length=0;
- L.listsize=0;
- }
- void ClearList(SqList &L)
- { // 初始條件:順序線性表L已存在。操作結果:將L重置爲空表
- L.length=0;
- }
- Status ListEmpty(SqList L)
- { // 初始條件:順序線性表L已存在。操作結果:若L爲空表,則返回TRUE,否則返回FALSE
- if(L.length==0)
- return TRUE;
- else
- return FALSE;
- }
- int ListLength(SqList L)
- { // 初始條件:順序線性表L已存在。操作結果:返回L中數據元素個數
- return L.length;
- }
- Status GetElem(SqList L,int i,ElemType &e)
- { // 初始條件:順序線性表L已存在,1≤i≤ListLength(L)。操作結果:用e返回L中第i個數據元素的值
- if(i<1||i>L.length)
- return ERROR;
- e=*(L.elem+i-1);
- return OK;
- }
- int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType))
- { // 初始條件:順序線性表L已存在,compare()是數據元素判定函數(滿足爲1,否則爲0)
- // 操作結果:返回L中第1個與e滿足關係compare()的數據元素的位序。
- // 若這樣的數據元素不存在,則返回值爲0。算法2.6
- ElemType *p;
- int 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 0;
- }
- Status PriorElem(SqList L,ElemType cur_e,ElemType &pre_e)
- { // 初始條件:順序線性表L已存在
- // 操作結果:若cur_e是L的數據元素,且不是第一個,則用pre_e返回它的前驅,
- // 否則操作失敗,pre_e無定義
- int i=2;
- ElemType *p=L.elem+1;
- while(i<=L.length&&*p!=cur_e)
- {
- p++;
- i++;
- }
- if(i>L.length)
- return INFEASIBLE; // 操作失敗
- else
- {
- pre_e=*--p;
- return OK;
- }
- }
- Status NextElem(SqList L,ElemType cur_e,ElemType &next_e)
- { // 初始條件:順序線性表L已存在
- // 操作結果:若cur_e是L的數據元素,且不是最後一個,則用next_e返回它的後繼,
- // 否則操作失敗,next_e無定義
- int i=1;
- ElemType *p=L.elem;
- while(i<L.length&&*p!=cur_e)
- {
- i++;
- p++;
- }
- if(i==L.length)
- return INFEASIBLE; // 操作失敗
- else
- {
- next_e=*++p;
- return OK;
- }
- }
- Status ListInsert(SqList &L,int i,ElemType e) // 算法2.4
- { // 初始條件:順序線性表L已存在,1≤i≤ListLength(L)+1
- // 操作結果:在L中第i個位置之前插入新的數據元素e,L的長度加1
- ElemType *newbase,*q,*p;
- if(i<1||i>L.length+1) // i值不合法
- return ERROR;
- if(L.length>=L.listsize) // 當前存儲空間已滿,增加分配
- {
- if(!(newbase=(ElemType *)realloc(L.elem,(L.listsize+LIST_INCREMENT)*sizeof(ElemType))))
- exit(OVERFLOW); // 存儲分配失敗
- L.elem=newbase; // 新基址
- L.listsize+=LIST_INCREMENT; // 增加存儲容量
- }
- q=L.elem+i-1; // q爲插入位置
- for(p=L.elem+L.length-1;p>=q;--p) // 插入位置及之後的元素右移
- *(p+1)=*p;
- *q=e; // 插入e
- ++L.length; // 表長增1
- return OK;
- }
- Status ListDelete(SqList &L,int i,ElemType &e) // 算法2.5
- { // 初始條件:順序線性表L已存在,1≤i≤ListLength(L)
- // 操作結果:刪除L的第i個數據元素,並用e返回其值,L的長度減1
- ElemType *p,*q;
- if(i<1||i>L.length) // i值不合法
- return ERROR;
- p=L.elem+i-1; // p爲被刪除元素的位置
- e=*p; // 被刪除元素的值賦給e
- q=L.elem+L.length-1; // 表尾元素的位置
- for(++p;p<=q;++p) // 被刪除元素之後的元素左移
- *(p-1)=*p;
- L.length--; // 表長減1
- return OK;
- }
- void ListTraverse(SqList L,void(*vi)(ElemType&))
- { // 初始條件:順序線性表L已存在
- // 操作結果:依次對L的每個數據元素調用函數vi()
- // vi()的形參加'&',表明可通過調用vi()改變元素的值
- ElemType *p;
- int i;
- p=L.elem;
- for(i=1;i<=L.length;i++)
- vi(*p++);
- printf("/n");
- }
bo2-1.cpp 順序表示的線性表(存儲結構由c2-1.h定義)的基本操作(12個)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.