原作者:点我查看原作者
#include<cstdio>
#include<iostream>
#include<cstdlib>
#define Elemtype int
#define Status int
#define OK 1
#define ERROR -1
typedef struct Node
{
struct Node * next;
Elemtype data;
} Node;
typedef Node * PtrtoNode;
typedef PtrtoNode Header;
int main()
{
Header La=NULL;
Header InitList(void);
Status DestroyList(Header L);
Status ClearList(Header L);
int ListEmpty(Header L);
int ListLength(Header L);
Status GetElem(Header L, int i, Elemtype &e);
int LocateElem(Header L, Elemtype e);
Status PriorElem(Header L, Elemtype cur_e, Elemtype &pre_e);
Status NextElem(Header L, Elemtype cur_e, Elemtype &next_e);
Status ListInsert(Header L, int i, Elemtype e);
Status ListDelete(Header L, int i);
Status ListTraverse(Header L);
return 0;
}
//初始化线性表
Header InitList(void) {
PtrtoNode L;
L = (PtrtoNode)malloc(sizeof(Node));
if (!L) exit(EXIT_FAILURE);
L->next = NULL;
return L;
}
//销毁线性表
Status DestroyList(Header L) {
if (!L)return ERROR;
PtrtoNode p = L;
PtrtoNode t;
while (p) {
t = p;
p = p->next;
free(t);
}
return OK;
}
//将线性表重置为空表
Status ClearList(Header L) {
if (!L)return ERROR;
PtrtoNode p = L->next;
PtrtoNode t;
while (p) {
t = p;
p = p->next;
free(t);
}
L->next = NULL;
return OK;
}
//检验是否为空表 是则返回true 否则返回false
int ListEmpty(Header L) {
if (!L) exit(-1);
return L->next == NULL;
}
//返回L中元素的个数
int ListLength(Header L) {
int i=1;
if (!L)exit(-1);
PtrtoNode p = L->next;
while (p) {
p = p->next;
++i;
}
return i-1;
}
//用e返回L中第i个元素的值
Status GetElem(Header L, int i, Elemtype &e) {
int j = 1;
PtrtoNode p = L->next;
while (p&&j < i) {
p = p->next;
++j;
}
if (!p || j > i) return ERROR;
e = p->data;
return OK;
}
//返回第一个与e相同的数据元素的位序
int LocateElem(Header L, Elemtype e) {
if (!L) exit(-1);
PtrtoNode p = L->next;
int i=1;
while (p&&e != p->data) {
p = p->next;
++i;
}
if (!p) return -1;
return i;
}
//找出cur_e并用pre_e存储它的前驱值
Status PriorElem(Header L, Elemtype cur_e, Elemtype &pre_e) {
if (!L) exit(-1);
PtrtoNode p = L;
if (p->next->data == cur_e) return ERROR;
else p = p->next;
while (p->next&&p->next->data != cur_e) {
p = p->next;
}
if (!p->next)return ERROR;
pre_e = p->data;
}
//找出cur_e并用next_e存储它的后继值
Status NextElem(Header L, Elemtype cur_e, Elemtype &next_e) {
if (!L) exit(-1);
PtrtoNode p = L->next;
while (p&&p->data != cur_e) {
p = p->next;
}
if (!p->next) exit(ERROR);
next_e = p->next->data;
return OK;
}
//在L的第i个位置前插入新的数据元素e
Status ListInsert(Header L, int i, Elemtype e) {
if (!L||i<1) exit(-1);
int j = 0;
PtrtoNode p = L;
PtrtoNode t = (PtrtoNode)malloc(sizeof(Node));
while (p&&j < i - 1) {
p = p->next;
++j;
}
if (!p || j > i - 1) return ERROR;
t->data = e;
t->next = p->next;
p->next = t;
return OK;
}
//删除第i个元素
Status ListDelete(Header L, int i) {
if (!L || i < 1) exit(-1);
int j = 1;
PtrtoNode p = L->next;
PtrtoNode t = NULL;
while (p&&j < i-1) {
p = p->next;
++j;
}
if (!(p->next) || j > i)return ERROR;
t = p->next;
p->next = p->next->next;
free(t);
return OK;
}
//遍历线性表
Status ListTraverse(Header L) {
if (!L)exit(-1);
PtrtoNode p = L->next;
while (p) {
printf("%d\n", p->data);
p = p->next;
}
return OK;
}