定义一个包含学生信息(学号,姓名,成绩)的的顺序表和链表,使其具有如下功能:
(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 ((n + S.length) < 0 || (n + S.length) > MAXSIZEList) { cout << "error: amount is illegal !!!"; return; }
cout << "\nimport " << n << " student : number(7) name(20) score( 0 - 150 分 ) :\n";
while (n)
{
cin >> S.data[S.length].no >> S.data[S.length].name >> S.data[S.length].score;
if (CkS(S, S.data[S.length],-1)) {
cout << "\ncontinue to import " << n << " student : number(7) name(20) score :\n";
continue; }
while (S.data[S.length].score > 150 || S.data[S.length].score < 0)
{
cout << "\nerror: the score is overflow(0-150) \nimport the score again:";
cin >> S.data[S.length].score;
}
S.length++;
n--;
}
cout << "all the data have saved ! ";
}
*//查看表中所有学生信息*
void OPuS(SqList &S)
{
if (S.length == 0) { cout << "\n it is an empty List !\n"; return; }
cout << "\nthe list of student :\n"<<endl<<"number\t\t"<<"name\t\t"<<"score\n";
int n = 0;
while (n < S.length) {
cout <<S.data[n].no << "\t\t" << S.data[n].name << "\t\t" << S.data[n].score << endl;
n++;
}
cout << endl;
}
*//按姓名查找学生*
void NaSeaS(SqList &S)
{
if (S.length == 0) { cout << "\nsorry ! no data !\n"; return; }
cout << "\nthe name of the student : ";
char ch[21];
int n = 0;
bool flag =false;
bool flag1 = false;
cin >> ch;
while (n < S.length)
{
if (!(flag || flag1)) { cout << "\nthe related students : \n" << endl << "number\t\t" << "name\t\t" << "score\n"; }
if (!strcmp(ch,S.data[n].name)) {
cout << endl << S.data[n].no << "\t\t" << S.data[n].name << "\t\t" << S.data[n].score;
flag = true; }
n++;
}
if (!flag) { cout << "\nsorry ! there is no this student !\n"; }
}
void DelS(SqList &S)
{
if (S.length == 0) { cout << "\nsorry ! no data !\n"; return; }
cout << "\nthe position of the student : (between 1 and "<<S.length<<" )";
int n;
cin >> n;
if (n>S.length||n<1) { cout << "\nerror: it is illegal !\n"; return; }
while (n < S.length)
{
S.data[n - 1] = S.data[n];
n++;
}
S.length--;
cout << "\nDeleted successfully ! \n";
}
*//在表中某个位置插入学生信息*
void InSerS(SqList &S)
{
if (S.length == MAXSIZEList) { cout << "\nwarning: The list is full !\n"; return; }
cout << "\nchoose the position between 1 and " << S.length + 1<<": "<<endl;
int n;
cin >> n;
if (n<1 || n>S.length + 1) { cout << "error: it is illegal !\n"; return; }
for (int t = S.length + 1 - n; t > 0; t--)
{
S.data[t + n] = S.data[t + n - 1];
}
cout << "\nimport the ( number(7) name(20) score(0-150) ):";
do {
cin >> S.data[n - 1].no >> S.data[n - 1].name >> S.data[n - 1].score;
} while (CkS(S, S.data[n - 1],n-1));
while (S.data[n - 1].score > 150 || S.data[n - 1].score < 0)
{
cout << "\nthe score is overflow(0-150)\nimport the score again:";
cin >> S.data[n - 1].score;
}
S.length++;
cout << " \nthis student have saved !!! \n";
}
*//统计总人数*
void SumS(SqList &S)
{
cout << "\nthe amount of the student in the list : " << S.length << endl;
}
*//链表*
//排重学号函数
bool CkL(LinkList &L,student st)
{
LinkList p = L->next;
while (p)
{
if (!strcmp(p->data.no, st.no))
{ cout << "\nthe number " << st.no << " is occupied !\n"; return true;
}
p = p->next;
}
return false;
}
//录入学生信息
void IPuL(LinkList &L)
{
cout << "\nthe amount of data : ";
int n;
cin >> n;
L->data.score += n;
if (n < 0) { cout << "error: import the number is illegal !"; return; }
LNode *p = L;
cout << "import " << n << " data: number(7) name(20) score( 0 - 150 分 )\n";
while (n)
{
LNode *q = new LNode;
InitL(q);
cin >> q->data.no >> q->data.name >> q->data.score;
if(CkL(L,q->data)){ cout << "continue to import " << n << " data: number(7) name(20) score( 0 - 150 分 )\n"; }
while (q->data.score > 150 || q->data.score < 0)
{
cout << "\nthe score is overflow(0-150)\nimport the score agian:";
cin >> q->data.score;
}
p->next = q;
p = q;
n--;
}
cout << "all the data have saved ! \n";
}
//查看整个表的学生信息
void OPuL(LinkList &L)
{
if (L->data.score==0) { cout << "\nit is an empty List ! "; return; }
cout << "\nthe list of student :\n" << endl << "number\t\t" << "name\t\t" << "score\n";
LinkList p = L->next;
while (p!=NULL)
{
cout << p->data.no << "\t\t" << p->data.name << "\t\t" << p->data.score << endl;
p = p->next;
}
}
//按姓名查找学生信息
void NaSeaL(LinkList &L)
{
if (L->data.score == 0) { cout << " \nit is an empty List !\n "; return; }
char ch[21];
bool flag = true;
cout << "\nthe name of the student : ";
cin >> ch;
LinkList p = L->next;
cout << "this is the list :" << endl << "number\t\t" << "name\t\t" << "score\n";
while (p!=NULL)
{
if (!strcmp(ch, p->data.name))
{
cout << p->data.no << "\t\t" << p->data.name << "\t\t" << p->data.score << endl;
flag =false;
}
p = p->next;
}
if (flag) { cout << "sorry! no such student ! \n"; }
}
//删除学生信息
void DelL(LinkList &L)
{
if (L->data.score == 0) { cout << "\n it is an empty List ! \n"; return; }
cout << "\nthe position of the student :";
int n;
cin >> n;
LinkList p = L->next;
while (n-2)
{
if (!p) { cout << "\nerror: the list is not so long !\n"; return; }
p = p->next;
n--;
}
if (!(n - 2)) { p->next = p->next->next; p = p->next; delete p; --L->data.score; cout << "\nDelete successfully !\n"; }
}
//选择某个位置插入学生信息
void InSerL(LinkList &L)
{
cout << "\nchooose the position between 1 and " << L->data.score+1<<endl;
int n;
cin >> n;
if (n<1 || n>L->data.score + 1) { cout << "\nerror: this operation is overflow !\n"; return; }
LinkList p=L;
while(n-1)
{
p = p->next;
n--;
}
LNode *q = new LNode;
cout << "\nimport the student( number(7) name(20) score( 0 - 150 分 ) ): ";
cin >> q->data.no >> q->data.name >> q->data.score;
while (CkL(L, q->data))
{
cout << "\nplease import again ( number(7) name(20) score( 0 - 150 分 ) ): ";
cin >> q->data.no >> q->data.name >> q->data.score;
}
while (q->data.score > 150 || q->data.score < 0)
{
cout << "\nthe score is overflow( 0 - 150 分 )\nimport the score again: ";
cin >> q->data.score;
}
q->next = p->next;
p->next = q;
L->data.score++;
cout << " \nthis student have saved !!! \n";
}
//统计学生人数
void SumL(LinkList &L)
{
cout << "\nthe amount of the student in the list : " << L->data.score << endl;
}
//主函数的排布
int main()
{ char choice;
SqList S;
InitS(S);
LNode * L = new LNode;
InitL(L);
L->data.score = 0;
do
{
InterFace();
cin >> choice;
switch (choice)
{
case '0':break;
case '1':char a;
do
{
InterFaceS();
cin >> a;
switch (a)
{
case '0':break;
case '1':IPuS(S); break;
case '2':OPuS(S); break;
case '3':NaSeaS(S); break;
case '4':DelS(S); break;
case '5':InSerS(S); break;
case '6':SumS(S); break;
default:cout << "\nerror: please choose the right command !\n";
}
} while (a!='0');
break;
case '2':char b;
do
{
InterFaceL();
cin >> b;
switch (b)
{
case '0':break;
case '1':IPuL(L); break;
case '2':OPuL(L); break;
case '3':NaSeaL(L); break;
case '4':DelL(L); break;
case '5':InSerL(L); break;
case '6':SumL(L); break;
default:cout << "\nplease choose the right command !\n";
}
} while (b!='0');
break;
default:cout << "\nplease make a right choose !\n";
}
} while (choice!='0');
return 0;
}