赞
踩
实验一顺序表实现
实验名称:顺序表实现
实验目的:
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 student为DataType
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); // 为里面的元素分配m个DataType大小的内存空间,相当于初始化了一个长度为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的元素,注意下标范围是从0到count-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;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。