数据结构C++顺序表实现(henu.hjy)

#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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用c++实现顺序:多文件编程,层次清晰,函数有注释 SeqList();//构造函数,存储的元素个数设为0 bool setLength(size_t length);//设置已经存储的元素个数 bool addElement(ElemType element);//把某个元素添加到顺序末尾 bool addElement(ElemType element , size_t n);//插入一个元素,使其成为第n个元素,其余元素后移 bool delElement();//删除所有的元素 bool delElement(size_t n);//删除第n个元素 bool delElement(string elementDetailType,string elementDetail);//通过某个元素细节找到元素,把这个元素删除 bool replaceElement(ElemType element , size_t n);//使用一个元素,替换掉第n个元素 bool swapElement(size_t n1 , size_t n2);//把第n1个元素和第n2个元素交换 ElemType* getElement();//得到数组头的指针 ElemType* getElement(size_t n);//得到第n个元素的指针 size_t getLength();//得到存储的元素个数 size_t getMaxSize();//得到顺序容量 bool showElementDetail();//输出所有的元素细节 bool showElementDetail(size_t n);//输出第n个元素的细节 bool showElementDetail(string elementDetailType,string elementDetail);//通过某个元素细节找到元素,输出元素所有细节 size_t findElement(string elementDetailType,string elementDetail);//通过某个元素细节找到元素位置 static int inputAInt(int min = 0,int max = 9,int defaultValue = -1);//从键盘读取,限制为一个min到max间的整数,非法情况返回defaultValue void startControlLoop();//打开控制界面 ~SeqList();//析构函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值