我们正在学数据结构,两星期前写好了线性表的所有基本操作,运行全部正确。包括InitList、DestoryList、ClearList、ListEmpty、ListLength、GetElem、LocateElem、PriorElem、NextElem、ListInsert、ListDelete、ListTraverse
我所编译的环境是VC++ 6.0,有三个文件linklist.h linklist.cpp main.cpp 至于怎样用你应该知道的,我就不多说了。
========================linklist.h============================
#include <iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
//线性表的单链表存储结构
typedef struct LNode
{
ElemType data;
int len;
struct LNode * next;
}LNode,*LinkList;
void CreateList_L(LinkList &L,int n);
int ListLength(LinkList L);
Status ListInsert(LinkList & L,int i,ElemType e);
Status ListDelete(LinkList & L,int i,ElemType & e);
ElemType GetElem(LinkList L,int i);
Status EmptyList_L(LinkList L);
int LocateElem(LinkList L,ElemType e);
Status PriorElem(LinkList L,ElemType curr_e,ElemType & e);
Status NextElem(LinkList L,ElemType curr_e,ElemType & e);
Status ListTraverse(LinkList L);
Status ClearList_L(LinkList & L);
void DestoryList_L(LinkList & L);
==========================linklist.cpp=======================
#include "linklist.h"
int LISTLEN = 0;
//逆序输入n个元素的值
//创建带有头结点的线性单链表
void CreateList_L(LinkList &L,int n)
{
L = (LinkList)malloc(sizeof(LNode));
L->len = 0;
L->next = NULL;
for(int i = n;i>0;--i)
{
LinkList p = (LinkList)malloc(sizeof(LNode));
cout<<"请输入元素的值(前插):";
cin>>p->data;
p->next = L->next; //插入到表头
L->next = p;
L->len++;
LISTLEN++;
}
}
//求表长
int ListLength(LinkList L)
{
int len1=0;
LinkList p = L->next;
while(p)
{
p = p->next;
len1++;
}
return len1;
//return L->len;
}
//在链表的第i位之前插入元素e
// i 的合法位置是:1 <= i <= ListLength(L)+1
Status ListInsert(LinkList & L,int i,ElemType e)
{
if(i<1 || i>ListLength(L)+1)
{
cout<<"插入失败! 访问越界..."<<endl;
return ERROR;
}
else
{
int j;
LinkList p = L;
for(j = 0;j<i-1;j++) //for循环结束后p将指向第i-1个元素,即应该在p后插入元素e
p = p->next;
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
L->len++;
return TRUE;
}
}
//删除链表的第i个元素,并用e返回值
//i的合法范围是:0<i<ListLength(L)+1
Status ListDelete(LinkList & L,int i,ElemType & e)
{
if(i<1 || i>ListLength(L))
{
cout<<"访问越界..."<<endl;
return ERROR;
}
else
{
LinkList p = L;
int j;
for(j = 0;j < i-1;j++) //for循环后指针p将指向要删除的元素的前驱结点
p = p->next;
e = p->next->data;
LinkList q = p->next;
p->next = q ->next;
L->len--;
free(q);
return TRUE;
}
}
//获取表中第i个元素
//i的合法取值范围是:0 < i < ListLength(L)+1
ElemType GetElem(LinkList L,int i)
{
if(i<1 || i>ListLength(L))
{
cout<<"取值非法! 链表中无此位序元素"<<endl;
return ERROR;
}
else
{
LinkList p = L;
int j;
for(j = 0;j<i;j++)
p = p->next;
return p->data;
}
}
//判断链表是否为空
Status EmptyList_L(LinkList L)
{
if(L->next == NULL)
return TRUE;
return ERROR;
}
//在链表中查找定位元素e的位序,并通过函数返回
int LocateElem(LinkList L,ElemType e)
{
int i = 0;
LinkList p = L;
while(p->next && p->next->data != e)
{
p = p->next;
i++;
}
if(p->next == NULL)
{
cout<<"在链表中找不到元素 "<<e<<endl;
return ERROR;
}
return (i+1);
}
//求当前元素curr_e的直接前驱元素,用e返回其值
Status PriorElem(LinkList L,ElemType curr_e,ElemType & e)
{
LinkList p = L;
while(p->next && curr_e != p->next->data)
p = p->next;
if(p->next == NULL)
{
cout<<"在链表中找不到元素 "<<curr_e<<" ,无法求其前驱元素!"<<endl;
return ERROR;
}
if(p == L)
{
cout<<"元素 "<<curr_e<<" 是链表中的首元元素,无前驱..."<<endl;
return ERROR;
}
e = p->data;
return OK;
}
/*
//求当前元素curr_e的直接后继元素,用e返回其值
Status NextElem(LinkList L,ElemType curr_e,ElemType & e)
{
LinkList p = L->next;
//cout<<curr_e<<endl;
//cout<<p->next->data<<endl;
if(p == NULL)
{
cout<<"链表是个空表!"<<endl;
return ERROR;
}
if(p->next == NULL)
{
cout<<"链表中只有一个元素,无后继..."<<endl;
return ERROR;
}
while(p->next && curr_e != p->data)
{
//cout<<"while"<<endl;
p = p->next;
}
cout<<"p->data = "<<p->data<<endl;
if(p->data != curr_e)
{
cout<<"111"<<endl;
cout<<"在链表中找不到元素 "<<curr_e<<" ,无法求其后继元素!"<<endl;
return ERROR;
}
if(p->next == NULL && curr_e == p->data)
{
cout<<"222"<<endl;
cout<<"元素 "<<curr_e<<" 是链表中的尾元元素,无后继..."<<endl;
return ERROR;
}
cout<<"333"<<endl;
e = p->data;
return OK;
}
*/
//求当前元素curr_e的直接后继元素,用e返回其值
Status NextElem(LinkList L,ElemType curr_e,ElemType & e)
{
LinkList p = L->next;
while(p && p->data != curr_e)
p = p->next;
if(p == L->next)
{
if(p == NULL)
{
cout<<"\n链表是一个空表,无法做取后继操作!"<<endl;
return ERROR;
}
else
{
cout<<"\n链表中只有一个元素,无法求其后继..."<<endl;
return ERROR;
}
}
if(p == NULL)
{
cout<<"\n在链表中未能找到元素: "<<curr_e<<endl;
return ERROR;
}
if(p->next == NULL)
{
cout<<"\n元素 "<<curr_e<<" 是链表的尾元元素,无法求其后继..."<<endl;
return ERROR;
}
e = p->next->data;
return OK;
}
//对链表进行遍历操作
Status ListTraverse(LinkList L)
{
LinkList p = L->next;
if(LISTLEN == 0)
{
cout<<"\n链表中除头结点以外的所有内容已被释放,是一个空表!"<<endl;
cout<<"\n遍历失败..."<<endl;
return ERROR;
}
if(LISTLEN == -1)
{
cout<<"\n所有内容已被释放,链表已被销毁!"<<endl;
cout<<"\n遍历失败..."<<endl;
return ERROR;
}
while(p != NULL)
{
cout<<p->data<<" ";
p = p->next;
}
cout<<"\n遍历成功!"<<endl;
return OK;
}
//清空链表的内容
//单链表的清空是指释放除头结点以外的内存空间
Status ClearList_L(LinkList & L)
{
LinkList p = L;
while(p->next)
{
LinkList m = p->next;
free(p);
p = m;
}
L->next = NULL;
LISTLEN = 0;
return OK;
}
//销毁链表
//单链表的释放是指释放链表的所有结点内存空间
void DestoryList_L(LinkList & L)
{
LinkList p = L;
while(p->next)
{
LinkList m = p->next;
free(p);
p = m;
}
//free (p);
//free (L);
LISTLEN = -1;
}
=========================main.cpp=======================
#include "linklist.h"
int main()
{
LinkList L;
ElemType e;
ElemType curr_e;
int n;
int status; //返回函数执行状态
cout<<"请输入所需创建的元素个数:";
cin>>n;
cout<<endl;
//创建单链表
CreateList_L(L,n);
cout<<endl;
//遍历
status = ListTraverse(L);
//返回链表表长
cout<<"\n单链表的长度是: "<<ListLength(L)<<endl;
//链表的插入操作
cout<<"\n请输入需要插入元素的位置: ";
cin>>n;
cout<<"\n请输入插入的元素值: ";
cin>>e;
status = ListInsert(L,n,e);
if(status)
cout<<"\n链表元素插入成功!"<<endl;
else
cout<<"\n链表元素插入失败!"<<endl;
status = ListTraverse(L);
cout<<endl;
//单链表的删除操作
cout<<"请输入需要删除的元素的位置: ";
cin>>n;
status = ListDelete(L,n,e);
if(status)
{
cout<<"\n删除成功!";
cout<<" 删除的元素是: "<<e<<endl;
}
else
cout<<"\n删除失败..."<<endl;
status = ListTraverse(L);
cout<<endl;
//获取单链表的元素
cout<<"请输入你想获取的元素在链表中的位置: ";
cin>>n;
e = GetElem(L,n);
if(n > 0 && n <= L->len)
cout<<"\n单链表第"<< n <<"个元素值是: "<<e<<endl;
//单链表判空操作
status = EmptyList_L(L);
if(status)
cout<<"\n单链表为空表!"<<endl;
else
cout<<"\n单链表非空,其中含有元素."<<endl;
//查找定位元素
cout<<"\n请输入所需查找的元素: ";
cin>>e;
n = LocateElem(L,e);
if(n)
cout<<"\n元素 "<<e<<" 在链表中的位置是: "<<n<<endl;
//前驱操作
cout<<"\n需要求其前驱的元素值: ";
cin>>curr_e;
status = PriorElem(L,curr_e,e);
if(status)
cout<<"\n元素 "<<curr_e<<" 的前驱是: "<<e<<endl;
//后继操作
cout<<"\n需要求其后继的元素值: ";
cin>>curr_e;
status = NextElem(L,curr_e,e);
if(status)
cout<<"\n元素 "<<curr_e<<" 的后继是: "<<e<<endl;
//单链表的清空操作
cout<<"\n调用清空链表函数";
status = ClearList_L(L);
cout<<endl;
status = ListTraverse(L);
//单链表的销毁操作
cout<<"\n调用链表销毁函数";
DestoryList_L(L);
cout<<endl;
status = ListTraverse(L);
cout<<endl;
return 0;
}
温馨提示:答案为网友推荐,仅供参考