定义一个包含学生信息(学号,姓名,成绩)的的顺序表和链表,使其具有如下功能:
(1) 根据指定学生个数,逐个输入学生信息;
顺序表:申请一个MAXSIZE=100大小的结构体数组,获取学生个数n,用一个for或者while循环逐个输入学生的各项基本信息,并存储到结构体中,且每次要记录插入的学生人数与和上一次操作的人数进行加和。
链表:获取学生个数n,每录入一个学生就动态申请一个学生信息结点,将其插入到表头。
(2) 逐个显示学生表中所有学生的相关信息;
顺序表:用一个循环,循环length次,依次读取学生信息并显示。
链表:用一个循环,从表头读取到表尾,即指针不空则进入循环,依次输出每个学生的信息并显示。
(3) 根据姓名进行查找,返回此学生的学号和成绩;
顺序表:获取用户所要查找的学生姓名,用一个循环,条件为未到length前,从基地址依次取出学生的姓名进行比较判断,若找到匹配的信息,则输出结果,否则告知查无此学生信息。
链表:获取所要查找的学生信息,用一个循环,获取表头指针,条件为指针不空,从表头依次取出学生姓名进行比较判断,若找到匹配的信息,则输出结果,否则告知查无此学生信息。
(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
顺序表:获取指定位置,首先位置判断是否合理,然后直接读取该位置的学生各项基本信息。
链表:获取指定位置,用循环,条件为指针不空,依次把头指针往后挪,若在这之前遇到空指针,则告知该位置无学生信息,否则输出该位置的学生信息。
(5) 给定一个学生信息,插入到表中指定的位置;
顺序表:获取指定的位置p,首先判断位置是否合理以及顺序表是否已满,p不可大于length+1或者小于0,再把length到p位置的学生依次往后挪,再插入p位置的学生信息。相应学生人数length++。
链表:获取指定的位置p,首先判断位置是否合理,申请新结点q存入要插入的学生信息,再把指针移到p-1这个位置,把p-1的next信息给q的next,在把q赋予p-1的next。
(6) 删除指定位置的学生记录;
顺序表:获取指定位置p,判断位置是否合理,依次将p之后的学生信息往前挪,直到length,再把length的信息赋值为空,相应学生人数见一length–。
链表:获取指定位置,申请两个指针p,q,一个指向当前位置,另一个指向前一个,用循环,条件为指针不空,依次把p,q指针往后挪,若在这之前遇到空指针,则告知该位置无学生信息,不用删除,否则把p的next给q的next,delete掉p。
(7) 统计表中学生个数。
顺序表:直接用length时刻记录学生人数。
链表:每次统计,要从表头循环到表尾,暂存到记数器l中。
调试结果:
初定义模块:
#include<iostream>
#include<iomanip>
#include<cstring>
#define MAXSIZEList 100//顺序表的大小
using namespace std;
//顺序表的结构体
typedef struct
{
char no[8];//学号
char name[21];//姓名
float score;//分数
}student;
typedef struct
{
student *data;
int length;
}SqList;
//链表的结构体
typedef struct LNode
{
student data;
struct LNode *next;
}LNode,*LinkList;
初始化模块:
//顺序表
void InitS(SqList &S)
{
S.data = new student[MAXSIZEList];//申请MAXSIZEList大小的内存
S.length = 0;
}
//链表
void InitL(LinkList &L)
{
L->next = NULL;
}
主界面&子界面菜单:
void InterFace()
{
cout << "\n ************** ************* ***************\n";
cout << " * 1.使用顺序表 2.使用链表 0.退出系统 *" << endl;
cout << " ************** ************* ***************\n";
cout << "\nmake a choice : ";
}
void InterFaceS()
{
cout << "\n ********SqList(顺序表)*************" << endl;
cout << " * 1.录入 2.查看表中信息 * " << endl;
cout << " * 3.按姓名查询 4.删除学生 * " << endl;
cout << " * 5.选择位置插入 6.统计总人数 * " << endl;
cout << " * 0.退出顺序表 *" << endl;
cout << " **********************************" << endl;
cout << "\nmake a choice : ";
}
void InterFaceL()
{
cout << "\n *******NodeList(链表)*********" << endl;
cout << " * 1.录入 2.看表 * " << endl;
cout << " * 3.按姓名查询 4.删除信息 * " << endl;
cout << " * 5.选择插入 6.统计总人数 * " << endl;
cout << " * 0.退出链表 * " << endl;
cout << " ****************************** " << endl;
cout << "\nmake a choice : ";
}
线性表的功能实现模块:
*//**顺序表**
//排重学号判断函数*
bool CkS(SqList &S, student st,int t)
{
int n = 0;
while (n<S.length)
{
if (!(strcmp(S.data[n].no, st.no))&&n!=t) {
cout << "\nthe number " << st.no << " is occupied ! \n"; return true; }
n++;
}
return false;
}
*//录入学生信息*
void IPuS(SqList &S)
{
cout << "\nthe amount of the student: ";
int n;
cin >> n;
if (