數據結構 線性表 順序表示和實現

predefine.h

//預定義函數返回結果頭文件
//文件名pre_define.h
//函數結果狀態代碼
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define UNDERFLOW -2

//假設數組維數的最大值爲8
#define MAX_ARRAY_SIZE 8

//Status是函數的類型,其值是函數結果狀態代碼
typedef int Status;

//Boolean是布爾類型,其值是TRUE或FALSE
typedef int ElemType;

SqList.cpp

<pre name="code" class="cpp"#include "pre_define.h"#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define LIST_INIT_SIZE 100 // 線性表存儲空間的初始分配量#define LISTINCREMENT 10 // 線性表存儲空間的分配增量typedef struct{ElemType *elem; // 存儲空間基址int length; // 當前長度int listsize; // 當前分配的存儲容量} SqList;bool compare(ElemType e1, ElemType e2){if (e1 == e2)return true;return false;}Status InitList_Sq(SqList &L){// 構造一個空的線性表LL.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));if (!L.elem) exit(OVERFLOW); // 存儲分配失敗L.length = 0; // 空表長度爲0L.listsize = LIST_INIT_SIZE; // 初始存儲容量return OK;}//銷燬線性表LStatus DestroyList(SqList &L){free(L.elem);L.elem = NULL;L.length = 0;L.listsize = 0;return OK;}//將L重置爲空表Status ClearList(SqList &L){L.elem = NULL;L.length = 0;return OK;}//判斷L是否爲空表Status ListEmpty(SqList L){if (L.length == 0)return TRUE;elsereturn FALSE;}//返回L中數據元素的個數int ListLength(SqList L){return L.length;}//用e返回L中第i個數據元素Status GetElem(SqList L , int i , ElemType &e){if (i < 1 || i > L.length)return ERROR;e = *(L.elem + i - 1);return OK;}//返回L中第1個與e滿足關係compare()的數據元素的位序,若這樣的元素不存在,則返回值爲0int LocateElem(SqList L , ElemType e , Status (*compare)(ElemType , ElemType)){int i = 1;for (; i < L.length; i++){if (compare(e, L.elem[i])) break;}if (i <= L.length)return i;elsereturn 0;}//若cur_e是L中的數據元素,且不是第一個,則用pre_e返回它的前驅,否則操作失敗Status PriorElem(SqList L ,ElemType cur_e , ElemType &pre_e){int i = 2;ElemType *p = L.elem + 1;while(i <= L.length && *p != cur_e){p++;i++;}if (i > L.length)return ERROR;else{pre_e = *(--p);return OK;}}//若cur_e是L中的數據元素,且不是最後一個,則用next_e返回它的後繼,否則操作失敗Status NextElem(SqList L , ElemType cur_e , ElemType &next_e){int i = 1;ElemType *p = L.elem;while(i < L.length && *p != cur_e){p++;i++;}if (i == L.length)return ERROR;else{next_e = *(++p);return OK;}}//在L中第i個位置之前插入新的數據元素,L的長度加1Status ListInsert(SqList &L , int i , ElemType e){ElemType *p, *q, *newbase;if (i < 1 || i > L.length + 1) return ERROR;if (L.length == L.listsize){newbase = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));if (!newbase) exit(OVERFLOW);L.elem = newbase;L.listsize += LISTINCREMENT;}// q爲插入位置q = L.elem + i - 1;for (p = L.elem + L.length - 1; p >= q; --p) *(p+1) = *p;*q = e;++L.length;return OK;}//刪除L中的第i個數據元素,並用e返回其值,L的長度減1Status ListDelete(SqList &L , int i , ElemType &e){ElemType *p, *q;if (i < 1 || i > L.length) return ERROR;q = L.elem + i - 1;for (p = q; p <= L.elem + L.length - 1; p++) *p = *(p+1);e = *q;--L.length;return OK;}//歸併兩個線性表void MergeList(SqList La , SqList Lb , SqList &Lc){ElemType *pa, *pb, *pc, *pa_last, *pb_last;pa = La.elem;pb = Lb.elem;Lc.listsize = Lc.length = La.length + Lb.length;pc = Lc.elem = (ElemType *)malloc(Lc.listsize * sizeof(ElemType));pa_last = La.elem + La.length - 1;pb_last = Lb.elem + Lb.length - 1;while(pa <= pa_last && pb <= pb_last){if(*pa <= *pb)*pc++ = *pa++;else*pc++ = *pa++;}while(pa <= pa_last)*pc++ = *pa++;while(pb <= pb_last)*pc++ = *pb++;}

發佈了37 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章