头文件:
#include<cstdlib>
#include<iostream>
using namespace std;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
#include<iostream>
using namespace std;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
//构造一个空的线性表L
Status InitList_L(LinkList& L)
{
L = (LinkList)malloc(sizeof(LNode));
if (!L)
exit(OVERFLOW);
L->next = NULL;
return OK;
}
Status InitList_L(LinkList& L)
{
L = (LinkList)malloc(sizeof(LNode));
if (!L)
exit(OVERFLOW);
L->next = NULL;
return OK;
}
//销毁线性表L
Status DestroyList_L(LinkList& L)
{
LinkList q;
while (L)
{
q = L->next;
free(L);
L = q;
}
return OK;
}
Status DestroyList_L(LinkList& L)
{
LinkList q;
while (L)
{
q = L->next;
free(L);
L = q;
}
return OK;
}
//将线性表L置为空表
Status ClearList_L(LinkList& L)
{
LinkList p=L->next, q;
while (p)
{
q = p->next;
free(p);
p = q;
}
L->next = NULL;
return OK;
}
Status ClearList_L(LinkList& L)
{
LinkList p=L->next, q;
while (p)
{
q = p->next;
free(p);
p = q;
}
L->next = NULL;
return OK;
}
//判断线性表L是否为空表
Status ListEmpty_L(LinkList L)
{
if (NULL == L->next)
return TRUE;
else
return FALSE;
}
Status ListEmpty_L(LinkList L)
{
if (NULL == L->next)
return TRUE;
else
return FALSE;
}
//返回线性表L中数据元素的个数
int ListLength_L(LinkList L)
{
LinkList p = L->next;
int i;
for ( i = 0; p; p = p->next)
++i;
return i;
}
int ListLength_L(LinkList L)
{
LinkList p = L->next;
int i;
for ( i = 0; p; p = p->next)
++i;
return i;
}
//用元素e返回线性表L中第i个数据元素的值
Status GetElem_L(LinkList L, int i, ElemType& e)
{
LinkList p = L->next;
int j = 1;
while (p && j < i)
{
++j;
p = p->next;
}
if (!p || j>i)
return ERROR;
e = p->data;
return OK;
}
Status GetElem_L(LinkList L, int i, ElemType& e)
{
LinkList p = L->next;
int j = 1;
while (p && j < i)
{
++j;
p = p->next;
}
if (!p || j>i)
return ERROR;
e = p->data;
return OK;
}
//数据元素之间的关系函数,例如数学关系:a=b
Status compare(ElemType a, ElemType b)
{
if (a == b)
return TRUE;
else
return FALSE;
}
Status compare(ElemType a, ElemType b)
{
if (a == b)
return TRUE;
else
return FALSE;
}
//返回线性表L中第一个与元素e满足compare()关系的数据元素的位序;若不存在,返回0
Status LocateElem_L(LinkList L, ElemType e, Status(*compare)(ElemType, ElemType))
{
LinkList p = L->next;
int i = 1;
while (p && !(*compare)(e, p->data))
{
++i;
p = p->next;
}
if (!p)
return 0;
return i;
}
Status LocateElem_L(LinkList L, ElemType e, Status(*compare)(ElemType, ElemType))
{
LinkList p = L->next;
int i = 1;
while (p && !(*compare)(e, p->data))
{
++i;
p = p->next;
}
if (!p)
return 0;
return i;
}
//若cur_e是线性表L中的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义
Status PriorElem_L(LinkList L, ElemType cur_e, ElemType& pre_e)
{
LinkList p = L->next, q;
while (p&&p->next)
{
q = p->next;
if (q->data == cur_e)
{
pre_e = p->data;
return OK;
}
p = q;
}
return INFEASIBLE;
}
Status PriorElem_L(LinkList L, ElemType cur_e, ElemType& pre_e)
{
LinkList p = L->next, q;
while (p&&p->next)
{
q = p->next;
if (q->data == cur_e)
{
pre_e = p->data;
return OK;
}
p = q;
}
return INFEASIBLE;
}
//若cur_e是线性表L中的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义
Status NextElem_L(LinkList L, ElemType cur_e, ElemType& next_e)
{
LinkList p = L->next;
if (p)
{
while (p->next)
{
if (p->data == cur_e)
{
next_e = p->next->data;
return OK;
}
p = p->next;
}
}
return INFEASIBLE;
}
Status NextElem_L(LinkList L, ElemType cur_e, ElemType& next_e)
{
LinkList p = L->next;
if (p)
{
while (p->next)
{
if (p->data == cur_e)
{
next_e = p->next->data;
return OK;
}
p = p->next;
}
}
return INFEASIBLE;
}
//在线性表L中第i个位置之前插入新的数据元素e,表L的长度加1
Status ListInsert_L(LinkList& L, int i, ElemType e)
{
LinkList p = L;
int j = 0;
while (p&&j < i - 1)
{
p = p->next;
++j;
}
if (!p || j>i - 1)
return ERROR;
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
Status ListInsert_L(LinkList& L, int i, ElemType e)
{
LinkList p = L;
int j = 0;
while (p&&j < i - 1)
{
p = p->next;
++j;
}
if (!p || j>i - 1)
return ERROR;
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
//删除线性表L的第i个元素,并用元素e返回其值,表L的长度减1
Status ListDelete_L(LinkList& L, int i, ElemType& e)
{
LinkList p = L;
int j = 0;
while (p->next&&j < i - 1)
{
p = p->next;
++j;
}
if (!p || j > i - 1)
return ERROR;
LinkList q = p->next;
p->next = q->next;
e = q->data;
free(q);
return OK;
Status ListDelete_L(LinkList& L, int i, ElemType& e)
{
LinkList p = L;
int j = 0;
while (p->next&&j < i - 1)
{
p = p->next;
++j;
}
if (!p || j > i - 1)
return ERROR;
LinkList q = p->next;
p->next = q->next;
e = q->data;
free(q);
return OK;
}
//访问线性表中的数据元素
Status visit(ElemType i)
{
if (cout<<i<<" ")
return TRUE;
return FALSE;
}
Status visit(ElemType i)
{
if (cout<<i<<" ")
return TRUE;
return FALSE;
}
//一次对线性表L的每个数据元素调用函数visit();一旦visit()失败,则操作失败
Status ListTraverse_L(LinkList L, Status (*visit)(ElemType))
{
LinkList p = L->next;
while (p)
{
if (!visit(p->data))
return INFEASIBLE;
p = p->next;
}
return OK;
}
Status ListTraverse_L(LinkList L, Status (*visit)(ElemType))
{
LinkList p = L->next;
while (p)
{
if (!visit(p->data))
return INFEASIBLE;
p = p->next;
}
return OK;
}
主程序:
#include"LinkList.h"
void main(void)
{
LinkList L;
InitList_L(L);
for (int i = 1, j = 1; i < 20;++j, i += 2)
ListInsert_L(L, j, i);
cout << "线性表L的信息为:" << endl;
cout << "*******************************************" << endl;
cout << "长度为:" << ListLength_L(L)<<endl;
cout << "数据元素分别为:";
ListTraverse_L(L,visit);
cout << endl;
cout << "*******************************************" << endl;
ElemType e;
GetElem_L(L, 6, e);
cout << "第6个数据是:" << e << endl;
ElemType pre;
if (PriorElem_L(L, e, pre) != INFEASIBLE)
cout << e << "前面的数据是:" << pre << endl;
else
cout << "数据元素" << e << "没有前驱!" << endl;
ElemType next;
if (NextElem_L(L, e, next) != INFEASIBLE)
cout << e << "后面的数据是:" << next << endl;
else
cout << "数据元素" << e << "没有后继!" << endl;
cout << "删除数据" << e << endl;
if (ListDelete_L(L, 6, e))
{
cout << "删除数据成功!" << endl;
cout << "更新后的数据是:" << endl;
cout << "*******************************************" << endl;
cout << "长度为:" << ListLength_L(L) << endl;
cout << "数据元素分别为:";
ListTraverse_L(L, visit);
cout << endl;
cout << "*******************************************" << endl;
}
else
cout << "删除失败!" << endl;
cout << "值为7的数据元素的位置在:";
cout <<"第"<< LocateElem_L(L, 7, compare)<<endl;
cout << "线性表L是否为空表:";
if (ListEmpty_L(L))
cout << "是" << endl;
else
cout << "否" << endl;
cout << "现将线性表L置为空表:" << endl;
ClearList_L(L);
cout << "线性表L是否为空表:";
if (ListEmpty_L(L))
cout << "是" << endl;
else
cout << "否" << endl;
cout << "将线性表L销毁!" << endl;
DestroyList_L(L);
}
void main(void)
{
LinkList L;
InitList_L(L);
for (int i = 1, j = 1; i < 20;++j, i += 2)
ListInsert_L(L, j, i);
cout << "线性表L的信息为:" << endl;
cout << "*******************************************" << endl;
cout << "长度为:" << ListLength_L(L)<<endl;
cout << "数据元素分别为:";
ListTraverse_L(L,visit);
cout << endl;
cout << "*******************************************" << endl;
ElemType e;
GetElem_L(L, 6, e);
cout << "第6个数据是:" << e << endl;
ElemType pre;
if (PriorElem_L(L, e, pre) != INFEASIBLE)
cout << e << "前面的数据是:" << pre << endl;
else
cout << "数据元素" << e << "没有前驱!" << endl;
ElemType next;
if (NextElem_L(L, e, next) != INFEASIBLE)
cout << e << "后面的数据是:" << next << endl;
else
cout << "数据元素" << e << "没有后继!" << endl;
cout << "删除数据" << e << endl;
if (ListDelete_L(L, 6, e))
{
cout << "删除数据成功!" << endl;
cout << "更新后的数据是:" << endl;
cout << "*******************************************" << endl;
cout << "长度为:" << ListLength_L(L) << endl;
cout << "数据元素分别为:";
ListTraverse_L(L, visit);
cout << endl;
cout << "*******************************************" << endl;
}
else
cout << "删除失败!" << endl;
cout << "值为7的数据元素的位置在:";
cout <<"第"<< LocateElem_L(L, 7, compare)<<endl;
cout << "线性表L是否为空表:";
if (ListEmpty_L(L))
cout << "是" << endl;
else
cout << "否" << endl;
cout << "现将线性表L置为空表:" << endl;
ClearList_L(L);
cout << "线性表L是否为空表:";
if (ListEmpty_L(L))
cout << "是" << endl;
else
cout << "否" << endl;
cout << "将线性表L销毁!" << endl;
DestroyList_L(L);
}