实验一 顺序表实现

实验一顺序表实现

实验名称:顺序表实现

实验目的:

1、掌握线性表的顺序存储结构的含义与实现方法

2、掌握顺序表的上的插入和删除操作

3、掌握顺序表的简单应用

实验内容:

1、根据课件关于顺序表的定义,实现顺序表

2、利用所实现的顺序表存储学生表格,要求能在命令行界面输入和输出表格的记录

3、测试数据

A、   用数据创建表格 001 张三 2005 70

                   002 李四 2004 65

B、张三之后插入    003 王五 2005 80

   张三之前插入    004 马六 2006 90

   李四之后插入    005 黄荣 2004 85

C、删除第一条记录

删除最后一条记录

           D、查找黄荣是否在表中,在则打印“存在记录:005 黄荣 2004 85”,否则打印“不存在”

                        查找郭清是否在表中,打印相应结果

                     E、打印整个表格

              

实验结果:

 

include<iostream.h>

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<iomanip.h>

#defineMAXLENGTH 30;

//usingnamespace std;

struct student

{

  int id; // 学号

  char name[30]; // 姓名

  char sex[2]; // 性别

  float gread; // 成绩

};

typedef structstudent DataType; //  指定struct studentDataType

struct SeqList

{

 int MAX;    // 顺序表中最大元素的个数

 int count;         // 存放线性表中元素的个数count <= MAXLENGTH

 DataType* element;  // element[0], element[1], ..., element[n -1]存放线性表中的元素

};

 

typedef structSeqList *MySeqList;

// 初始化并创建空顺序表

MySeqListinitSeqList(int m);

// 判断线性表是否为空

intisEmptySeqList(MySeqList mySeqList);

// 在顺序表中求某元素的下标

intlocateSeqList(MySeqList mySeqList, int id);

// 在顺序表中修改值

intupdateSeqList(MySeqList mySeqList, int id);

// 顺序表的插入(元素p之前插入)

intinsertPreSeqList(MySeqList mySeqList, int p, DataType x);

// 顺序表的插入(元素p之后插入)

int insertNextSeqList(MySeqListmySeqList, int p, DataType x);

// 顺序表的删除(根据下标删除)

intdeleteSeqList(MySeqList mySeqList, int p);

// 顺序表的删除(根据元素值删除)

intdeleteSeqListByValue(MySeqList mySeqList, int id);

// 将顺序表表示的线性表逆置

intreverseSeqList(MySeqList mySeqList);

 

int deleteAllVSeqList(MySeqListmySeqList, DataType x);

// 求出下标为i的元素的前驱和后继

intfindPrePostSeqList(MySeqList mySeqList, int i, DataType &m, DataType&n);

// 顺序表实现部分:找出值为x的元素的前驱和后继的存储位置(即下标)

intlocatePrePostSeqList(MySeqList mySeqList, DataType x, int &i, int &j);

// 输出线性表的元素值

voidprintSeqList(MySeqList &mySeqList);

// 根据学生id,输出线性表的元素值

voidprintSeqListById(MySeqList &mySeqList,int id);

void showall()

{

       for(int i=0;i<count;i++)

       {cout<<setw(4)<<element[i].id;

       cout<<setw(4)<<element[i].name;

       cout<<setw(4)<<element[i].sex;

       cout<<setw(4)<<element[i].gread<<endl;

       }

}

// 在顺序表中修改值

intupdateSeqList(MySeqList mySeqList, int id)  //学生信息登入

{

 int iRc = locateSeqList(mySeqList, id);

 if (iRc == -1)

 {

  printf("不存在指定下标!\n");

  return (0);

 }

 

 cout<<"学号  姓名   性别    成绩 "<<endl;

 cin>>mySeqList->element[iRc].id>>mySeqList->element[iRc].name>>mySeqList->element[iRc].sex>>mySeqList->element[iRc].gread;

  return 1;

}

 

// 功能: 创建空顺序表

MySeqListinitSeqList(int m)

{

 MySeqList mySeqList =(MySeqList)malloc(sizeof(struct SeqList)); // 分配内存空间

 if (mySeqList != NULL)

 {

  mySeqList->element =(DataType*)malloc(sizeof(DataType) * m);  // 为里面的元素分配mDataType大小的内存空间,相当于初始化了一个长度为m的数组

  if (mySeqList->element)

  {

   mySeqList->MAX = m;  // 如果创建了元素,MAXLENGTH为最大元素的个数

   mySeqList->count = 0;  // 空表长度为0

   return (mySeqList);

  }

  else

   free(mySeqList);        // 记得要手动释放空间,否则很容易产生内存泄漏

 }

 printf("内存空间不足,请关闭一些程序,然后再试!\n"); // 存储分配失败,提示空间不足

 return NULL;

}

// 功能: 判断线性表是否为空

intisEmptySeqList(MySeqList mySeqList)

{

 return (mySeqList->count ==0);

}

// 功能:在顺序表中求某元素的下标,没有查找到,则返回-1

intlocateSeqList(MySeqList mySeqList, int id)

{

 for (int i = 0; i < mySeqList->count;++i)

  if (mySeqList->element[i].id == id)             // 传入一个元素x,查找到后返回下标i

   return (i);

 return (-1);

}

// 功能:顺序表的pos下标前面插入,插入成功返回1,失败返回0

intinsertPreSeqList(MySeqList mySeqList, int pos, DataType x)

{

 ++mySeqList->count;

 if (mySeqList->count >mySeqList->MAX)      // 溢出

 {

  --mySeqList->count;   

  printf("表产生了溢出!\n");

  return (0);

 }

 if (pos < 0 || pos >= mySeqList->count)         // 不存在下标为pos的元素

 {

  --mySeqList->count;

  printf("不存在指定下标!\n");

  return (0);

 }

 for (int i = mySeqList->count - 1; i !=pos; --i)

  {mySeqList->element[i] =mySeqList->element[i - 1]; // 插入位置及之后的元素均后移一个位置

 mySeqList->element[i] = x;                          // 插入元素x

 return (1);

 }

}

// 功能:顺序表的pos下标后面插入,插入成功返回1,失败返回0

intinsertNextSeqList(MySeqList mySeqList, int pos, DataType x)

{

 if (pos < 0 || pos >=mySeqList->count)

 {

  printf("不存在指定下标!\n");

  return (0);

 }

 ++mySeqList->count;

 if (mySeqList->count >=mySeqList->MAX)

 {

  --mySeqList->count;

  printf("表产生了溢出!\n");

  return (0);

 }

 

 for (int i = mySeqList->count - 1; i != pos+ 1; --i)

  {mySeqList->element[i] =mySeqList->element[i - 1];  // 同样地,把pos+1插入位置及之后的元素均后移一个位置

 mySeqList->element[i] = x;                           // 插入元素x

 return (1);

 }

}

// 功能:顺序表的删除(根据下标删除)

intdeleteSeqList(MySeqList  mySeqList, intpos)

{

 if (pos < 0 || pos >=mySeqList->count)      // 不存在下标为pos的元素,注意下标范围是从0count-1

 {

  printf("不存在指定下标!\n");

  return (0);

 }

 

 for (int i = pos; i < mySeqList->count -1; ++i)

  mySeqList->element[i] =mySeqList->element[i + 1];   // 被删除元素之后的元素均前移一个位置

 --mySeqList->count;                                  // 元素个数减1

 return (1);

}

// 功能:根据元素值删除,实现顺序表的删除

int deleteSeqListByValue(MySeqListmySeqList, int id)

{

 int pos = locateSeqList(mySeqList, id);

 if (pos == -1)

 {

  printf("不存在指定下标!\n");

  return (0);

 }

 deleteSeqList(mySeqList, pos);

 return (1);

}

 

 

intdeleteAllSeqListByValue(MySeqList mySeqList, int x)

{

 if (mySeqList->count == 0)

 {

  printf("该表为空!\n");

  return (0);

 }

 for (int i = 0; i != mySeqList->count; ++i)

 {

 

  if (mySeqList->element[i].id == x )

  { 

      deleteSeqListByValue(mySeqList,x);             // 删除x,删除后要将下标减少1

      i--;

  }

 }

 return (1);

}

 

 

intdeleteAllVSeqList(MySeqList mySeqList, int x)

{

 if (mySeqList->count == 0)

 {

  printf("该表为空!\n");

  return (0);

 }

 int p = 0, q = 0;

 while (mySeqList->element[p].id != x&& p != mySeqList->count - 1) // 跳过开始不是x的元素

 {

  ++p;

  ++q;

 }

 for (; p != mySeqList->count - 1; ++p)                            // 遍历元素,不遍历最后一个元素(为了防止越界)

 {

  while (mySeqList->element[p].id == x&& p != mySeqList->count - 1) // 如果元素是x,则游标p后移(while处理多个x连续的情况)

  {

   ++p;

  }

  if (p != mySeqList->count - 1)

  {

   mySeqList->element[q] =mySeqList->element[p];

   ++q;

  }

 }

 if (mySeqList->element[mySeqList->count- 1].id != x)

 {

  mySeqList->element[q] =mySeqList->element[mySeqList->count - 1];

  ++q;

 }

 mySeqList->count = q;

 return (1);

}

 

// 功能:找出值为x的元素的前驱和后继的存储位置(即下标)

intlocatePrePostSeqList(MySeqList mySeqList, int x, int &i, int &j)

{

 int k = locateSeqList(mySeqList, x);

 if (k == -1)

  return (0);

 if (k == 0)

  i = -1;

 else

  i = k - 1;

 if (k == mySeqList->count - 1)

  j = -1;

 else

  j = k + 1;

 return (1);

}

// 输出线性表的元素值

voidprintSeqList(MySeqList &mySeqList)

{

 

 for (int i = 0; i < mySeqList->count;++i)  // 输出线性表的元素值

 {

   cout<< "学号:" <<mySeqList->element[i].id << ",姓名:" << mySeqList->element[i].name << ",性别:" <<mySeqList->element[i].sex ;

   cout<< "语文:" <<mySeqList->element[i].gread;

   cout<<endl;

 }

 cout << endl;

}

// 根据学生id,输出线性表的元素值

voidprintSeqListById(MySeqList &mySeqList,int id)

{

 

 for (int i = 0; i < mySeqList->count;++i)  // 输出线性表的元素值

 {

   if (id == mySeqList->element[i].id)

   {

     cout<< "学号:" <<mySeqList->element[i].id << ",姓名:" << mySeqList->element[i].name << ",性别:" <<mySeqList->element[i].sex ;

     cout<< "语文:" <<mySeqList->element[i].gread;

     cout<<endl;

     break;

   }

 }

 

}

int main(intargc, char* argv[])

{

 

MySeqListmySeqList = initSeqList(20); // 初始化一个长20的表

L:

   system("cls");

   cout<< "                 ""学生成绩管理系统""                "<<endl;

   cout<<endl;

   cout<< "1.添加学生信息"<<endl;

   cout<<"2.查找学生信息"<<endl;

   cout<< "3.删除学生信息"<<endl;

   cout<<"4.修改学生信息"<<endl;

   //cout<<"5.输出所有学生信息"<<endl;

   cout<< "5.退出学生系统"<<endl;

   int i; 

   cout<<"请选择一个操作(1-6):";

   cin>>i;

   if (i == 1)

   {  

     mySeqList->count = 1;

  int iRc = 0;

 while(true&&mySeqList->count<20)

  {  

       cout<<endl<<"请添加学生信息(输入*退出添加):"<<endl;

    cout<<"姓名:";  

  

    cin>>mySeqList->element[iRc].name;

          if(strcmp(mySeqList->element[iRc].name,"*") == 0)

              {

                             mySeqList->count--; 

                             goto L;

                            }

                            cout<<"学号: ";

                            cin>>mySeqList->element[iRc].id;

                            cout<<"性别: ";

                            cin>>mySeqList->element[iRc].sex;

                               cout<<"成绩: ";

                            cin>>mySeqList->element[iRc].gread; 

        

                            cout << "成功添加学生成绩信息成绩。"<<endl;

                                     printSeqList(mySeqList);

                                     mySeqList->count++;

                                     iRc++;

                       }

       

         }

   else if (i == 2)

   {

L4:

       cout<<"请输入要查找的学生学号:"<<endl;

    int sid;

    cin>>sid;

    if (locateSeqList(mySeqList,sid) != -1)

    {

     cout<<"成功查询学号为"<<sid<<"的学生成绩。"<<endl;

           printSeqListById(mySeqList,sid);

    }

    else

    {

     cout<<"查询学生成绩错误,可能不存在学号为"<<sid<<"的学生."<<endl;

    }

    int iopselect;

    cout<<endl<<"还要继续查询吗?(按0返回主菜单,否则继续此操作。)"<<endl;

    cin>>iopselect;

    if (iopselect == 0)

     goto L ;

    else

        goto L4;

 

   }

   else if (i == 3)

   {

L1:

       cout<<"请输入要删除的学生学号:"<<endl;

    int stu_id;

    cin>>stu_id;

  

       if(deleteSeqListByValue(mySeqList,stu_id) == 1)

         cout<<"成功删除学生成绩。"<<endl;

    else

   cout<<"删除学生成绩出错。"<<endl;

    printSeqList(mySeqList);

    int iop;

    cout<<endl<<"还要继续删除吗?(按0返回主菜单,否则继续此操作。)"<<endl;

    cin>>iop;

    if (iop == 0)

     goto L ;

    else

        goto L1;

   }

   else if (i == 4)

   {

L3:

    cout<<"请输入要修改的学生学号:"<<endl;

       int id;

    cin>>id;

    if(updateSeqList(mySeqList,id) ==1)

         cout << "成功修改学生成绩信息成绩。"<<endl;

    else

         cout << "修改学生成绩信息成绩出错。"<<endl;

       printSeqList(mySeqList);

    int iselect;

    cout<<endl<<"还要继续修改吗?(按0返回主菜单,否则继续此操作。)"<<endl;

    cin>>iselect;

    if (iselect == 0)

     goto L ;

    else

        goto L3;

   }

   else if(i==5)

   {

  

   }

   else if (i == 6)

   { 

    system("cls");

    cout<<"您已经出本系统,欢迎下次再使用."<<endl;

   }

  

 return 0;

}

      

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值