顺序表的基本操作
(1)根据指定学生个数,逐个输入学生信息; //CreatList(&L)
(2) 逐个显示学生表中所有学生的相关信息; //ViewList(&L)
(3) 根据姓名进行查找,返回此学生的学号;//SearchList(L,name)
(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);//GetElem(&L,i,&e)
(5) 给定一个学生信息,插入到表中指定的位置; //ListInsert(&L,i,e)
(6) 删除指定位置的学生记录;//ListDelete(&L,i,&e)
(7) 统计表中及格学生个数。 //CountPassList(L)
(8)将顺序表中成绩为70分以上( >= 70)放在表的前面,70分以下的放在表后面。 //invert(&L)
1.结构定义
#include<iostream>
using namespace std;
#include<string>
#define MAXSIZE 100
#define ERROR 0
#define OK 1
#define FALL -2
typedef struct student {
int Id; //学生ID
string name; //学生姓名
int score; //学生成绩
string sex; //学生性别
}ElemType;
typedef struct LNode {
ElemType *stu_; //顺序表的表头
int length; //顺序表的长度
}SqList;
2.顺序表的初始化,创建学生信息函数
int InitList(SqList &L) //初始化顺序表
{
L.stu_ = new ElemType[MAXSIZE];
if (!L.stu_)
return ERROR;
L.length = 0;
return OK;
}
ElemType* CreatElem() ->返回一个学生类型(student或者ElemType) //创建一个学生信息
{
ElemType *elem = new student; //创建一个elem,并分配一个student类型的空间
cout << "请输入学生Id" << endl;
cin >> elem->Id;
cout << "请输入学生姓名" << endl;
cin >>elem->name;
cout << "请输入学生姓别" << endl;
cin >> elem->sex;
cout << "请输入学生成绩" << endl;
cin >> elem->score;
return elem;
}
3.交换节点,打印函数
void Swap(ElemType& a, ElemType& b) //交换两个结点的数据
{
ElemType temp = a; //创建一个中间变量
a = b;
b = temp;
}
void Print(SqList L, int i) //打印在指定位置的学生信息
{
cout << "学生Id为:" << L.stu_[i].Id << endl;
cout << "学生姓名为:" << L.stu_[i].name << endl;
cout << "学生性别为:" << L.stu_[i].sex << endl;
cout << "学生成绩为:" << L.stu_[i].score << endl;
}
4.根据指定学生个数,逐个输入学生信息
//(1)根据指定学生个数,逐个输入学生信息; //CreatList(&L)
int CreatList(SqList &L)
{
int n;
cout << "请输入要录入学生的个数:" << endl;
cin >> n ;
if (L.length + n > MAXSIZE)
{
cout << "录入学生个数多于最大值出现错误!" << endl;
return ERROR;
}
for (int i = 0; i < n; i++)
{
ElemType *e = CreatElem();
L.stu_[L.length+i].Id = e->Id;
L.stu_[L.length+i].name = e->name;
L.stu_[L.length+i].score = e->score;
L.stu_[L.length + i].sex = e->sex;
}
L.length += n;
return OK;
}
5.逐个显示学生表中所有学生的相关信息
//(2) 逐个显示学生表中所有学生的相关信息; //ViewList(&L)
void ViewList(LNode L)
{
if (L.length == 0)
cout << "无学生信息" << endl;
else
for (int i = 0; i < L.length; i++)
{
cout << "学生Id为:" << L.stu_[i].Id << endl;
cout << "学生姓名为:" << L.stu_[i].name << endl;
cout << "学生性别为:" << L.stu_[i].sex << endl;
cout << "学生成绩为:" << L.stu_[i].score << endl;
}
}
6.根据姓名进行查找,返回此学生的学号
}
//(3) 根据姓名进行查找,返回此学生的学号;//SearchList(L,name)
int SearchList(SqList L, char* name)
{
if (L.length == 0)
{
cout << "无学生信息" << endl;
return ERROR;
}
for (int i = 0; i < L.length; i++)
if (L.stu_[i].name == name)
{
return L.stu_[i].Id;
}
cout << "未找到有关的信息" << endl;
return ERROR;
}
7.根据指定的位置可返回相应的学生信息(学号,姓名,成绩)
//(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);//GetElem(&L,i,&e)
int GetElem(SqList L, int i, ElemType& e)
{
if (i>L.length) //如果i大于顺序表的长度这返回ERROR
return ERROR;
if (L.length==0) //如果顺序表为空,则返回FALL
return FALL;
e.Id = L.stu_[i-1].Id;
e.name = L.stu_[-1].name;
e.score = L.stu_[i-1].score;
e.sex = L.stu_[i-1].sex;
return OK;
}
8.给定一个学生信息,插入到表中指定的位置
//(5) 给定一个学生信息,插入到表中指定的位置; //ListInsert(&L,i,e)
int ListInsert(SqList& L, int i, ElemType e)
{
if (L.length + 1 > MAXSIZE )
return ERROR;
if(i>L.length) //如果插入的位置大于顺序表的长度,则直接在表尾插入
L.stu_[length] = e;
L.length ++;
return;
if(i>MAXSIZE) //插入位置大于最大限度,返回错误
return ERROR;
int j;
for ( j= L.length; j > i-1; j--)
L.stu_[j] = L.stu_[j - 1];
L.stu_[j] = e;
L.length += 1;
return OK;
}
9.删除指定位置的学生记录
//(6) 删除指定位置的学生记录;//ListDelete(&L,i,&e)
int ListDelete(SqList& L, int i, ElemType& e)
{
if (L.length == 0)
return ERROR;
if (i > L.length)
return FALL;
e = L.stu_[i - 1];
for (int j =i-1; j < L.length-1; j++)
{
L.stu_[j] = L.stu_[j + 1];
}
L.length -= 1;
return OK;
}
10.统计表中及格学生个数
//(7) 统计表中及格学生个数。 //CountPassList(L)
int CountPassList(SqList L)
{
int count=0;
if (L.length == 0)
return ERROR;
for (int i=0; i < L.length; i++)
if (L.stu_[i].score >= 60)
count += 1;
return count;
}
11.将顺序表中成绩为70分以上( >= 70)放在表的前面,70分以下的放在表后面
//(8)将顺序表中成绩为70分以上( >= 70)放在表的前面,70分以下的放在表后面。 //invert(&L)
int Invert(SqList& L)
{
if (L.length == 0)
return ERROR;
for (int i = 0; i < L.length; i++)//采用冒泡排序的方法
{
int MAX = i;
for (int j = i + 1; j < L.length; j++)
if (L.stu_[j].score >L.stu_[i].score)
{
Swap(L.stu_[j], L.stu_[i]);
};
}
return OK;
}