数据结构 实验一 顺序表的操作

1.实验性质:设计性实验

2.要求

  1. 编程实现顺序表的以下基本操作:建立顺序表,修改顺序表,插入顺序表,删除顺序表。
  2. 采用顺序表结构编程实现:两个集合的运算:交集/并集/差集。

3.实验目的

通过该实验,深入理解顺序表的逻辑结构、物理结构等概念,掌握顺序表基本操作的编程实现,注意顺序表插入、删除等操作过程中数据元素的移动现象,学生编写程序时,要考虑程序的健壮性,熟练掌握通过函数参数返回函数结果的办法。

4.实验内容

编程实现顺序表下教材第二章定义的线性表的基本操作,最好用菜单形式对应各个操作,使其变成一个完整的小软件。

5.参考界面

 

6.验收/测试用例

通过菜单调用各个操作,测试点:

  1. 插入数据(位置, 数据),要测插入位置不合法的情况(0,1)、(2,1),正确插入4个数据(1,2)、(1,1)、(3,3);
  2. 显示顺序表中的数据,屏幕输出1, 2, 3;
  3. 判空,屏幕输出顺便表非空;
  4. 顺便表长度,屏幕输出3;
  5. 获取指定位置元素,要测指定位置在【1,3】范围之外的情况和之内的情况;
  6. 定位,输入:4, 输出:不存在,输入2,输出位置为2;
  7. 求直接前驱,要测求第一个元素的前驱、不存在顺序表中的元素的直接前驱,其他元素的直接前驱;
  8. 求直接后继,要测最后一个元素的后继、不存在顺序表中的元素的直接后继,其他元素的直接后继;
  9. 删除,要测位置在【1,3】范围之外的情况和之内的情况;
    1. 清空操作后再测长度;
      #include<iostream>
      using namespace std;
      
      typedef int ElemType;
      typedef int Status;
      
      #define MAXSIZE 100
      #define listincrement 10
      #define OK 1
      #define ERROR 0
      

      1.线性表的存储结构

      需要有标的长度,当前表长,存储空间的基地址

      typedef struct{
          ElemType *elem;//存储空间的基地址
          int length;
          int listsize;//当前表长
      
      }SqList;

      2.初始化线性表

      思路:给线性表分配存储空间,长度置为0,表长置为最大长度MAXSIZE

      Ststus InitList(SqList &L)
      {
           L.elem=new ElemType[MAXSIZE];
           L.length=0;
           L.listsize=MAXSIZE;
           return OK;
      }

      3.销毁线性表

      思路:将存储空间释放,长度置为0,表长置为0

      void DestoryList(SqList &L)
      {
          if(L.elem)
              delete[] L.elem;
          L.length=0;
          L.listsize=0;
      }

      4.清空线性表

      思路:将线性表的长度置为0

      void ClearList(SqList &L)
      {
          L.length=0;
      }

      5.判断线性表是否为空

      思路:判断长度是否为0

      bool ListEmpty(SqList L)
      {
          return L.length==0;
      }

      6.求线性表长度

      思路:直接返回线性表长度即可

      Status GetLength(SqList L)
      {
          return L.length;
      }

      7.获取线性表指定位置元素

      思路:当输入的位置 i 在线性表合法范围之内,就输出下标 i-1。否则输入位置不合法。

      注意:线性表序号是从1开始的。

      void ChooseList(SqList L,int i)
      {
          if(i>0&&i<L.length)
              cout<<L.elem[i-1]<<endl;
          else
              cout<<"输入位置不合法!"<<endl;
      }

      8.求前驱

      思路:当输入的位置 i >1&& i <L.length,输出elem[i-2];

                  当输入的位置 i=1;第一个位置没有直接前驱

                   当输入的位置 i<0||i>L.length,输入位置不合法

      void BeforeList(SqList L,int i)
      {
          if(i>1&&i<L.length)
              cout<<"指定位置前驱是:"<<L.elem[i-2]<<endl;
          else if(i==1)
              cout<<"第一个元素无前驱"<<endl;
          else
              cout<<"输入位置不合法!"<<endl;
      }

      9.求后继

      思路:当输入的位置 i >0&& i <L.length,输出elem[i];

                  当输入的位置 i=L.length;最后一个位置没有直接后继

                   当输入的位置 i<0||i>L.length,输入位置不合法

      void AfterList(SqList L,int i)
      {
          if(i>0&&i<L.length)
              cout<<"该位置后继为:"<<L.elem[i]<<<endl;
          else if(i==L.length)
              cout<<"最后一个元素无后继"<<endl;
          else 
              cout<<"输入位置不合法!"<<endl;
      }

      10.在线性表指定位置插入元素

      思路:当输入的位置 i < 1|| i >L.length+1,输入位置不合法;

                  当线性表长度length=MAXSIZE;线性表满了不能插入。

                   当输入的位置 i >1&&i<L.length时,从插入的位置 i(包括)往后的元素都往后移一个位置。再把e的值赋给elem[i-1],长度加一即可。

      Status ListInsert(SqList &L,int i,ElemType e)
      {
          int j;
          if(i<1||i>L.length+1)
              return ERROR;
          if(L.length==MAXSIZE)
              return ERROR;
          for(j=L.length-1;j>=i-1;j--)
          {
              L.elem[j+1]=L.elem[j];
          }
          L.elem[i-1]=e;
          ++L.length;
          return OK
      }

      11.删除线性表指定位置元素

      思路:当输入位置 i >0&&i<=L.length时,从位置 i后面的元素往前移动一个位置即可。

      void DeleteList(SqList &L,int i)
      {
          if(i>0&&i<=L.length)
          {
              for(int k=i;k<L.length;k++)
                  L.elem[k-1]=L.elem[k];
              --L.length;
          }
          else
              cout<<"输入位置不合法!"<<endl;
      }

      12.显示线性表

      思路:从第一个序号开始到最后一个序号结束,输入元素即可。

      void DisplayList(SqList L)
      {
          for(int i=1;i<=L.length;++i)
              cout<<L.elem[i-1]<<" ";
          cout<<endl;
      }

      emm...最后整体代码

      #include <iostream>
      #include<cstdlib>
      using namespace std;
      
      typedef int ElemType;                //定义ElemType类型为int
      typedef int Status;
      
      #define MAXSIZE 100                  // 顺序表的最大长度
      #define LISTINCREMENT 10
      #define OK 1
      #define ERROR 0
      
      typedef struct                     //若后面不再用,可省略结构名
      {
          ElemType *elem;         //存储空间的基地址
          int    length;
          int listsize;                 //当前表长
      } SqList;
      
      //2.定义操作函数1
      
      
      Status InitList(SqList &L)
      {
          //构造一个空的顺序表L。
          L.elem = new ElemType[MAXSIZE];
          L.length = 0;  // 空表长度为0
          L.listsize=MAXSIZE;
          return OK;
      }
      
      void DestroyList(SqList &L)
      {
          if (L.elem) delete[ ] L.elem;    //释放存储空间
          L.length=0;
          L.listsize=0;
      }
      
      //1.清空线性表
      void ClearList(SqList &L)
      {
          L.length=0;   //将顺序表的长度置0
      }
      
      //2.判断线性表是否为空
      bool IsEmpty(SqList L)
      {
           return L.length==0;
      }
      
      //3----求线性表长度
      Status GetLength(SqList L)
      {
          return L.length;
      }
      
      //4----获取线性表指定位置元素
      void ChooseList(SqList L,int i)
      {
          if(i>0 && i<= L.length)
              cout << L.elem[i-1] << endl;
          else
              cout << "你输入的位置不合法!" << endl;
      }
      
      //5----求前驱
      void BeforeList(SqList &L,int i)
      {
          if(i>1 && i<=L.length)
              cout << "指定位置前驱是:" << L.elem[i-2] << endl;
          else if(i == 1)
              cout << "该位置无前驱!" << endl;
          else
              cout << "输入位置不合法!" << endl;
      }
      
      //6----求后继
      void AfterList(SqList &L,int i)
      {
          if(i>0 && i<L.length)
              cout << "该位置的后继是:" << L.elem[i] << endl;
          else if(i == L.length)
              cout << "该位置无后继!" << endl;
          else
              cout << "输入位置不合法!" << endl;
      }
      
      //7.在线性表指定位置插入元素
      Status   ListInsert(SqList &L,int i,ElemType e)
      {
          int j;
          if((i<1)||(i>L.length+1))return ERROR;
          if(L.length==MAXSIZE)return ERROR;
          for(j=L.length-1; j>=i-1; j--)
          {
              L.elem[j+1]=L.elem[j];
          }
          L.elem[i-1]=e;
          ++L.length;
          return OK;
      }
      
      //8----删除线性表指定位置元素
      void DeleteList(SqList &L,int i)
      {
          if(i>0 && i<=L.length)
          {
              for(int k=i;k<L.length;k++)
                  L.elem[k-1] = L.elem[k];
              --L.length;
          }
          else
              cout << "输入位置不合法!" << endl;
      }
      
      //9.显示线性表
      void DisplayList(SqList L)
      {
          for(int i=1;i<=L.length;++i)
              cout<<L.elem[i-1]<<" ";
          cout<<endl;
      }
      
      void show_help()
      {
          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<<"     退出,输出一个负数!"<<endl;
      }
      
      
      
      int main()
      {
          int operate_code;
          show_help();
      
          //定义线性表变量,如SqList L;
          SqList L;
      
          //调用初始化线性表函数,如  Init_List(L);
          InitList(L);
          ElemType e;
          int i;
          while(1)
          {
              cout<<"请输入操作代码:";
              cin>>operate_code;
              if(operate_code==1)
              {
                  //调用操作函数1
                  ClearList(L);
      
              }
              else if(operate_code==2)
              {
                  if(IsEmpty(L))
                      cout<<"The list is empty."<<endl;
                  else
                      cout<<"The list is not empty."<<endl;
              }
              else if(operate_code==3)
              {
                  cout<<"The length of list is :"<<GetLength(L)<<endl;
              }
              else if(operate_code==4)
              {
                  cout<<"请输入获取元素的位置:"<<endl;
                  cin>>i;
                  ChooseList(L,i);
              }
              else if(operate_code==5)
              {
                  cout<<"请输入你想求前驱元素的位置:"<<endl;
                  cin>>i;
                  BeforeList(L,i);
              }
              else if(operate_code==6)
              {
                  cout<<"请输入你想求后继元素的位置:"<<endl;
                  cin>>i;
                  AfterList(L,i);
              }
              else if(operate_code==7)
              {
                  cout<<"请输入插入元素及其位置:"<<endl;
                  cin>>e>>i;
                  if(ListInsert(L,i,e)==ERROR)
                      cout<<"插入位置不合法!"<<endl;
                  
      
              }
              else if(operate_code==8)
              {
                  cout<<"请输入想要删除元素的位置:"<<endl;
                  cin>>i;
                  DeleteList(L,i);
              }
              else if(operate_code==9)
              {
                  cout<<"The elements of the list are:"<<endl;
      
                  DisplayList(L);
              }
              else if(operate_code<0)
              {
                  break;
              }
              else
              {
                  cout<<"\n操作码错误!!!"<<endl;
                  cin.clear();
                  cin.sync();
                  show_help();
              }
      
      
          }
          //调用销毁线性表函数,如  Destroy_List(L);
          DestroyList(L);
          return 0;
      }
      

       

       

      总结:1.线性表的序号是从1开始的,所以求元素的时候要减去1才是下标。

       

      2.求前驱后继,进行插入删除等操作时,要把位置的各种情况考虑考虑。

      emm...就写这么多吧,以后再想起来再补充吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值