数据结构 线性表 顺序表示和实现

来源:互联网 发布:外国网友评论淘宝2016 编辑:程序博客网 时间:2024/04/28 21:59

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或FALSEtypedef 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++;}