#include <iostream>
#include <malloc.h>
#define LISTINITSIZE 100
#define LISTINCREMENT 10
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
using namespace std;
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
int listsize;
}SqList;
void title();
Status InitList(SqList &L); //创建一个空链表
Status DestoryList(SqList &L); //销毁一个线性表
Status ClearList(SqList &L); //清空一个线性表
int ListEmpty(SqList &L); //判断线性表是否为空
int ListLength(SqList &L); //求线性表长度
Status GetElem(SqList &L,int i,ElemType *e); //获取线性表指定位置元素
int PriorElem(SqList L,ElemType cur_e,ElemType *pre_e); //求前驱
int NextElem(SqList L,ElemType cur_e,ElemType *pre_e); //求后继
Status ListInsert(SqList &L,int i,ElemType e); //在线性表指定位置插入元素
Status ListDelete(SqList &L,int i,ElemType *e); //删除线性表指定位置元素
Status ListTraverse(SqList L); //显示线性表
int main()
{
title();
int option=0;
cin>>option;
while(option<0||option>11)
{
cout<<"输出异常,请重新输入:"<<endl;
cin>>option;
}
SqList La;
La.elem = NULL;
while(option!=0)
{
Status s = FALSE;
switch(option)
{
case 1:
if(La.elem){
cout<<"已存在,必须销毁再初始化"<<endl;
break;
}
s=InitList(La);
if(s){cout<<"创建空链表成功"<<endl;}
break; //创建一个空链表
case 2:s=DestoryList(La);if(s){cout<<"销毁链表成功"<<endl;}break; //销毁一个线性表
case 3:s=ClearList(La);if(s){cout<<"链表清空"<<endl;}break; //清空一个线性表
case 4:ListEmpty(La);break; //判断线性表是否为空
case 5:
int len; //用于返回线性表的长度
len=ListLength(La);
if(len>=0){cout<<"线性表长度为"<<len<<endl;}
break;求线性表长度
case 6:
if(La.elem==NULL)
{
cout<<"线性表不存在"<<endl;
break;
}
int pos; //用于输入位置
ElemType element;
cin>>pos;
s=GetElem(La,pos,&element);
if(s)
{
cout<<"在线性表中第"<<pos<<"位置上的元素为"<<element<<endl;
}
break;//获取线性表指定位置元素
case 7:
ElemType cur_elem,pre_elem; //前驱
if(La.elem==NULL)
{
cout<<"线性表不存在"<<endl;
}else
{
cout<<"输入要求前驱的数:"<<endl;
cin>>cur_elem;
s = PriorElem(La,cur_elem,&pre_elem);
if(s==TRUE)
{
cout<<"前驱是:"<<pre_elem<<endl;
}
else if(s==-1)
{
cout<<"这是表中的第一个元素,没有前驱"<<endl;
}
else if(s==FALSE)
{
cout<<"元素不存在线性表中"<<endl;
}
}
break;
case 8:
ElemType num_elem,next_elem; //后继
if(La.elem==NULL)
{
cout<<"线性表不存在"<<endl;
}else
{
cout<<"输入要求后继的数:"<<endl;
cin>>num_elem;
s = NextElem(La,num_elem,&next_elem);
if(s==TRUE)
{
cout<<"后继是:"<<next_elem<<endl;
}
else if(s==-1)
{
cout<<"这是表中的最后一个,没有后继"<<endl;
}
else if(s==FALSE)
{
cout<<"不存在线性表中"<<endl;
}
}
break;
case 9:
if(La.elem==NULL) //插入
{
cout<<"线性表不存在"<<endl;
}else
{
int pos,num;
cout<<"请输入插入的位置:"<<endl;
cin>>pos;
if(pos<1||pos>La.length+1)
{
cout<<"输入不合法,数值位置应在1-"<<La.length+1<<"之间"<<endl;
}
else
{
cout<<"请输入插入的数据:"<<endl;
cin>>num;
s = ListInsert(La,pos,num);
if(s)cout<<"插入成功"<<endl;
}
}
break;
case 10:
if(La.elem==NULL) //删除
{
cout<<"线性表不存在"<<endl;
}
else
{
int num,pos;
cout<<"请输入删除元素的位置:"<<endl;
cin>>pos;
s = ListDelete(La,pos,&num);
if(s)cout<<"插入成功,删除的数据为"<<num<<endl;
}
break;
case 11:
s = ListTraverse(La);
break;
}
title();
cin>>option;
}
return 0;
}
Status InitList(SqList &L) //创建一个空链表
{
L.elem=(ElemType*)malloc(LISTINITSIZE*sizeof(ElemType));
if(!L.elem)exit(OVERFLOW);
L.length=0;
L.listsize=LISTINITSIZE;
return TRUE;
}
Status DestoryList(SqList &L) //销毁一个线性表
{
if(L.elem == NULL)
{
cout<<"线性表不存在"<<endl;
return FALSE;
}
free(L.elem);
L.elem = NULL;
return TRUE;
}
Status ClearList(SqList &L) //清空一个线性表
{
if(L.elem == NULL)
{
cout<<"线性表不存在"<<endl;
return FALSE;
}
L.length = 0;
return TRUE;
}
int ListEmpty(SqList &L) //判断线性表是否为空
{
if(L.elem == NULL)
{
cout<<"线性表不存在"<<endl;
return TRUE;
}
else
{
if(L.length == 0)
{
cout<<"线性表为空表"<<endl;
return TRUE;
}
else
{
cout<<"线性表不为空表"<<endl;
return FALSE;
}
}
}
int ListLength(SqList &L) //求线性表长度
{
if(L.elem==NULL)
{
cout<<"线性表不存在"<<endl;
return -1;
}
return L.length;
}
Status GetElem(SqList &L,int i,ElemType *e) //获取线性表指定位置元素
{
if(L.length==0)
{
cout<<"线性表为空"<<endl;
return FALSE;
}
if(i<1||i>L.length)
{
cout<<"输入元素位置不合法,元素数字范围应在1-"<<L.length<<"之间"<<endl;
return FALSE;
}
*e = L.elem[i-1];
return TRUE;
}
int PriorElem(SqList L,ElemType cur_e,ElemType *pre_e) //求前驱
{
int i=0;
while((L.elem[i]!=cur_e)&&(i<L.length)) //定义一个变量i通过循环寻找输入元素cur_e的位置
{
i++;
}
if(i<L.length)
{
if(i==0)
return -1;
*pre_e = L.elem[i-1];
return TRUE;
}
else
{
return FALSE;
}
}
int NextElem(SqList L,ElemType cur_e,ElemType *pre_e) //求后继
{
int i=0;
while((L.elem[i]!=cur_e)&&(i<L.length)) //定义一个变量i通过循环寻找输入元素cur_e的位置
{
i++;
}
if(i<L.length)
{
if(i==L.length-1)
return -1;
*pre_e = L.elem[i+1];
return TRUE;
}
else
{
return FALSE;
}
}
Status ListInsert(SqList &L,int i,ElemType e) //在线性表指定位置插入元素 q为指定位置的地址 p为最后一个元素的地址
{
ElemType *p,*q,*newelem;
if(L.length>=L.listsize)
{
newelem = (ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(newelem==NULL)
{
exit(OVERFLOW);
}
L.elem=newelem;
L.listsize+=LISTINCREMENT;
}
q=L.elem+i-1;
for(p=L.length+L.elem-1;p>=q;p--)
{
*(p+1)=*p;
}
*q=e;
L.length++;
return TRUE;
}
Status ListDelete(SqList &L,int i,ElemType *e) //删除线性表指定位置元素
{
if(L.length==0)
{
cout<<"线性表为空表,无可删除元素"<<endl;
return FALSE;
}
if(i<1||i>L.length)
{
cout<<"输入不合法,数值应在1-"<<L.length<<"之间"<<endl;
return FALSE;
}
*e = L.elem[i-1];
for(i=i-1;i<L.length-1;i++)
{
L.elem[i]=L.elem[i+1];
}
L.length--;
return TRUE;
}
Status ListTraverse(SqList L) //显示线性表
{
ElemType *p;
if(L.elem==NULL)
{
cout<<"线性表不存在"<<endl;
return FALSE;
}
if(L.length==0)
{
cout<<"线性表中无元素!"<<endl;
return FALSE;
}
cout<<"线性表元素如下:"<<endl;
for(p=L.elem;p<=L.elem+L.length-1;p++)
{
cout<<*p<<" "<<endl;
}
cout<<endl;
return TRUE;
}
void title()
{
cout<<"*********************************"<<endl;
cout<<"*** 1.初始化一个线性表 ***"<<endl;
cout<<"*** 2.销毁一个线性表 ***"<<endl;
cout<<"*** 3.清空一个线性表 ***"<<endl;
cout<<"*** 4.判断线性表是否为空 ***"<<endl;
cout<<"*** 5.求线性表长度 ***"<<endl;
cout<<"*** 6.获取线性表指定位置元素 ***"<<endl;
cout<<"*** 7.求前驱 ***"<<endl;
cout<<"*** 8.求后继 ***"<<endl;
cout<<"*** 9.在线性表指定位置插入元素***"<<endl;
cout<<"*** 10.删除线性表指定位置元素 ***"<<endl;
cout<<"*** 11.显示线性表 ***"<<endl;
cout<<"*** 0.退出 ***"<<endl;
cout<<"*********************************"<<endl;
}
自己在开始学习数据结构时非常苦恼,牵涉到代码基本懵逼,所以希望同样学数据结构的同学可以少走弯路,代码着重于程序的健壮性,对于异常代码的处理情况。
之后是对于代码的解释放在一个文档中,有需要的可以来查看
原创文章——henu.hjy