线性表的顺序表示和实现
静态分配
#define Maxsize 100
typedef struct List{
Elemtype data[Maxsize];
int len;
};
void InitList(List& L) {
L.len = 0;
}//构造空表
void DestroyList(List& L) {
delete L.data;
L.len = NULL;
}//销毁
bool ListEmpty(List L) {
if (L.len == 0)return true;
else return false;
}//判空
int ListLength(List L) {
return L.len;
}//表长
void GetElem(List L, int i, Elemtype& e) {
e = L.data[i-1];
}//用e返回L中第i个数据元素
int LocateElem(List L,Elemtype e, bool (*compare)(Elemtype , Elemtype )) {
int i = 0;
for (i; i < L.len; i++) {
if (compare(e, L.data[i]))break;
}
return (i + 1);
}//返回满足copmare函数的e在L中的位序
void PriorElem(List L, Elemtype cur_e, Elemtype & pre_e) {
for (int i = 0; i < L.len; i++)
if (L.data[i] == cur_e && i != 0) { pre_e = L.data[i-1]; break; }
}//用pre_e返回cur_e的前驱
void NextElem(List L, Elemtype cur_e, Elemtype& next_e) {
for (int i = 0; i < L.len; i++)
if (L.data[i] == cur_e && i != L.len-1) { next_e = L.data[i + 1]; break; }
}//用next_e返回cur_e的后继
void ListInsert(List& L, int i, Elemtype e) {
for (int j = L.len; j > i-1; j--)L.data[j] = L.data[j - 1];
L.data[i-1] = e;
L.len++;
}//在L的第i位的元素前插入元素e
void ListDelete(List& L, int i, Elemtype& e) {
e = L.data[i - 1];
L.len--;
for (int j = i - 1; j < L.len; j++)L.data[j] = L.data[j + 1];
}//用额返回L中第i位元素并删除该元素
void ListTraverse(List L, void (*visit)(Elemtype)) {
for (int i = 0; i < L.len;i++) {
visit(L.data[i]);
}
}//用visit函数遍历L
动态分配
用到了malloc和free函数实现动态分配
相较于静态分配修改的部分是:
#define Initsize 10 //默认最大长度
typedef struct SeqList {
Elemtype* data;
int Maxsize;
int len;
};
void InitList(SeqList& L) {
L.data = (Elemtype*)malloc(Initsize * sizeof(Elemtype));
L.len = 0;
L.Maxsize = Initsize;
}//创建空表
void Increasesize(SeqList& L, int len) {
Elemtype* p = L.data;
L.data = (Elemtype*)malloc((L.Maxsize + len) * sizeof(Elemtype));
for (int i = 0; i < L.len; i++)L.data[i] = p[i];//转移数据
L.Maxsize = L.Maxsize + len;
free(p);
}//增加表长
void DestroyList(SeqList& L) {
free(L.data);
L.Maxsize = NULL;
L.len = NULL;
}//销毁
代码:
#define Initsize 10 //默认最大长度
typedef struct SeqList {
Elemtype* data;
int Maxsize;
int len;
};
void InitList(SeqList& L) {
L.data = (Elemtype*)malloc(Initsize * sizeof(Elemtype));
L.len = 0;
L.Maxsize = Initsize;
}//创建空表
void Increasesize(SeqList& L, int len) {
Elemtype* p = L.data;
L.data = (Elemtype*)malloc((L.Maxsize + len) * sizeof(Elemtype));
for (int i = 0; i < L.len; i++)L.data[i] = p[i];//转移数据
L.Maxsize = L.Maxsize + len;
free(p);
}//增加表长
void DestroyList(SeqList& L) {
free(L.data);
L.Maxsize = NULL;
L.len = NULL;
}//销毁
bool ListEmpty(List L) {
if (L.len == 0)return true;
else return false;
}//判空
int ListLength(List L) {
return L.len;
}//表长
void GetElem(List L, int i, Elemtype& e) {
e = L.data[i-1];
}//用e返回L中第i个数据元素
int LocateElem(List L,Elemtype e, bool (*compare)(Elemtype , Elemtype )) {
int i = 0;
for (i; i < L.len; i++) {
if (compare(e, L.data[i]))break;
}
return (i + 1);
}//返回满足copmare函数的e在L中的位序
void PriorElem(List L, Elemtype cur_e, Elemtype & pre_e) {
for (int i = 0; i < L.len; i++)
if (L.data[i] == cur_e && i != 0) { pre_e = L.data[i-1]; break; }
}//用pre_e返回cur_e的前驱
void NextElem(List L, Elemtype cur_e, Elemtype& next_e) {
for (int i = 0; i < L.len; i++)
if (L.data[i] == cur_e && i != L.len-1) { next_e = L.data[i + 1]; break; }
}//用next_e返回cur_e的后继
void ListInsert(List& L, int i, Elemtype e) {
for (int j = L.len; j > i-1; j--)L.data[j] = L.data[j - 1];
L.data[i-1] = e;
L.len++;
}//在L的第i位的元素前插入元素e
void ListDelete(List& L, int i, Elemtype& e) {
e = L.data[i - 1];
L.len--;
for (int j = i - 1; j < L.len; j++)L.data[j] = L.data[j + 1];
}//用额返回L中第i位元素并删除该元素
void ListTraverse(List L, void (*visit)(Elemtype)) {
for (int i = 0; i < L.len;i++) {
visit(L.data[i]);
}
}//用visit函数遍历L