实验目的:
1、掌握线性表的定义;
2、掌握线性表的基本操作,如建立、查找、插入和删除等。
实验内容:
定义一个包含学生信息(学号,姓名,成绩)的的顺序表和链表,使其具有如下功能:
(1) 根据指定学生个数,逐个输入学生信息;
(2) 逐个显示学生表中所有学生的相关信息;
(3) 根据姓名进行查找,返回此学生的学号和成绩;
(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
(5) 给定一个学生信息,插入到表中指定的位置;
(6) 删除指定位置的学生记录;
(7) 统计表中学生个数。
实验提示:
学生信息的定义:
typedef struct {
char no[8]; //8位学号
char name[20]; //姓名
int price; //成绩
}Student;
顺序表的定义
typedef struct {
Student *elem; //指向数据元素的基地址
int length; //线性表的当前长度
}SqList;
链表的定义:
typedef struct LNode{
Student data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
实验要求:
(1) 程序要添加适当的注释,程序的书写要采用缩进格式。
(2) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应,如插入删除时指定的位置不对等等。
(3) 程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。
(4) 根据实验报告模板详细书写实验报告,在实验报告中给出链表根据姓名进行查找的算法和插入算法的流程图。
(5) 上传源程序和实验报告到ftp的相应班级所在文件夹。顺序表的源程序保存为SqList.cpp,链表的源程序保存为LinkList.cpp,实验报告命名为:实验报告1.doc。源程序和实验报告压缩为一个文件(如果定义了头文件则一起压缩),按以下方式命名:学号姓名.rar,如070814101薛力.rar。
链表:
#include "pch.h"
#include <iostream>
#include<string>
#include<iomanip>
using namespace std;
struct Student
{
string num;//学号
string name;//姓名
int price;//成绩
};
struct LNode
{
Student data;
struct LNode *next;
};
int length = 0;
void Initlist(LNode *&list);//建立空表
void Insert(LNode *&list, Student student);//逐个输入学生信息
void show(LNode *&list);//逐个显示学生表中所有学生的相关信息
void find(LNode *&list, string name);//根据姓名进行查找,返回此学生的学号和成绩
bool Position(int pos, LNode *&list);//根据指定的位置可返回相应的学生信息(学号,姓名,成绩)
void PInsert(int pos, LNode*&list, Student student);//给定一个学生信息,插入到表中指定的位置
void Delete(int pos, LNode *&list);// 删除指定位置的学生记录
void tips();//按提示操作
int main()
{
LNode *list;//建立链表
tips();
puts(" 欢迎进入学生管理系统 ");
int choose = 0;
Initlist(list);//初始化链表
int n;//学生人数
cout << "请初始化学生信息,输入学生数量:";
cin >> n;
puts("开始初始化学生信息");
while (n--)//初始化学生信息
{
Student student;
cout << "输入新学生信息" << endl;
cout << "请输入姓名:";
cin >> student.name;
cout << "请输入学号:";
cin >> student.num;
cout << "请输入成绩:";
cin >> student.price;
cout << "该学生信息录入完成" << endl;
Insert(list, student);
}
cout << "请输入您仍想进行的操作:";
cin >> choose;
while (true)//实现学生系统功能部分
{
if (choose == 7) break;
switch (choose)
{
case 1: //逐个显示学生表中所有学生的相关信息;
{
show(list);
break;
}
case 2: //根据姓名进行查找,返回此学生的学号和成绩;
{
string name;//查找姓名
cout << "请输入查找姓名:";
cin >> name;
find(list, name);
break;
}
case 3: //根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
{
int pos;//查找位置
cout << "请输入查找位置:";
cin >> pos;
Position(pos, list);
break;
}
case 4://给定一个学生信息,插入到表中指定的位置;
{
Student stu;//插入学生信息
cout << "输入新学生信息" << endl;
cout << "请输入姓名:";
cin >> stu.name;
cout << "请输入学号:";
cin >> stu.num;
cout << "请输入成绩:";
cin >> stu.price;
cout << "该学生信息录入完成" << endl;
int pos;//插入位置
cout << ("请输入插入位置:");
cin >> pos;
PInsert(pos, list, stu);
puts("插入学生信息成功!");
break;
}
case 5://删除指定位置的学生记录;
{
int pos;
cout << ("请输入删除位置:");
cin >> pos;
Delete(pos, list);
cout << "该学生信息删除成功!" << endl;
break;
}
case 6://统计表中学生个数。
{
cout << "学生总人数为:" << length << endl;
break;
}
default://输入错误情况处理
{
puts("输入错误,请重新输入");
break;
}
}
cout << "请输入您仍想进行的操作:";
cin >> choose;
}
cout << "退出成功,欢迎下次使用!" << endl;
}
void Initlist(LNode *&list)//建立空表
{
list = new LNode;//对表进行初始化
list->next = NULL;
}
void Insert(LNode *&list, Student student)//逐个输入学生信息
{
LNode *temp = new LNode;
temp->data = student;
temp->next = NULL;
LNode *p;
p = list;
while (p->next!=NULL)//搜寻到最后一个数据,以便在尾部添加学生信息
{
p = p->next;
}
p->next = temp;
length++;
puts("输入学生信息成功!");
}
void show(LNode *&list)//逐个显示学生表中所有学生的相关信息
{
LNode *p;
p = list;
cout << "学生信息表" << endl;
cout << "学号" << setw(6) << "姓名" << setw(6) << "成绩" << endl;
while (p->next!=NULL)//依次输出学生数据
{
p = p->next;
cout << p->data.num << setw(8) << p->data.name << setw(8) << p->data.price << endl;
}
}
void find(LNode *&list, string name)//根据姓名进行查找,返回此学生的学号和成绩
{
LNode *p;
p = list;
while (p->next!=NULL)//遍历链表
{
if (name.compare(p->data.name) == 0)//查找是否有名字相匹配
{
cout << "学号" << setw(8) << "姓名" << setw(8) << "成绩" << endl;
cout << p->data.num << setw(8) << p->data.name << setw(8) << p->data.price << endl;
return;
}
p = p->next;
}
cout << "查无此人" << endl;//若循环跳出至这步,说明系统中并无此人
}
bool Position(int pos, LNode *&list)//根据指定的位置可返回相应的学生信息(学号,姓名,成绩)
{
if (pos<1 || pos>length) { cout << "位置输入错误,请保证该位置大于0且小于学生人数" << endl; return false; }//输入位置错误处理
else
{
LNode *p;
p = list;
int i = 0;
while (i<pos)
{
p = p->next;
i++;
}
cout << "学号" << setw(8) << "姓名" << setw(8) << "成绩" << endl;
cout << p->data.num << setw(8) << p->data.name << setw(8) << p->data.price << endl;
return true;
}
}
void PInsert(int pos, LNode*&list, Student student)//给定一个学生信息,插入到表中指定的位置
{
if (pos<1 || pos>length) cout << "插入位置错误" << endl;//输入位置错误处理
else
{
LNode*p;
p = list;
int i = 1;
while (i<pos)//找到指定位置
{
p = p->next;
i++;
}
LNode *temp;
Initlist(temp);
temp->data = student;
temp->next = p->next;
p->next = temp;//将学生信息插入
length++;
cout << "插入学生信息成功!" << endl;
}
}
void Delete(int pos, LNode *&list)// 删除指定位置的学生记录
{
if (pos<1 || pos>length) cout << "位置输入错误,请保证该位置大于0且小于学生人数" << endl;
else
{
int i = 1;
LNode *p,*q;
p = list;
while (p->next!=NULL&&i<pos)//找到指定位置
{
p = p->next;
i++;
}
q = p->next;
p->next = q->next;//将指针指向下下个节点,从而达到删除目的
length--;
free(q);//释放q的内存,防止内存泄漏
}
}
void tips()//按提示操作
{
puts("请根据指引进行操作");
puts("输入1,逐个显示学生表中所有学生的相关信息");
puts("输入2,根据姓名进行查找,返回此学生的学号和成绩");
puts("输入3,根据指定的位置可返回相应的学生信息(学号,姓名,成绩)");
puts("输入4,给定一个学生信息,插入到表中指定的位置");
puts("输入5,删除指定位置的学生记录");
puts("输入6,统计表中学生个数");
puts("输入7,退出");
}
效果图:
#include "pch.h"
#include <iostream>
#include<string>
#include<iomanip>
#include<stdio.h>
#include<stdlib.h>
#define maxsize 1000
using namespace std;
struct Student
{
string num;//学号
string name;//姓名
int price;//成绩
};
struct List
{
Student *student;//指向元素的基地址
int length;//返回当前长度
};
void InitList(int n, List &list);//根据指定学生个数,逐个输入学生信息
void Show(List &list);//显示所有学生信息
void Find(string name, List &list);//根据姓名进行查找,返回此学生的学号和成绩
void Position(int pos, List &list); //根据指定的位置可返回相应的学生信息(学号,姓名,成绩)
void Insert(int pos, List &list, Student stu);//给定一个学生信息,插入到表中指定的位置
void Delete(int pos, List &list);//删除指定位置的学生记录
int Length(List &list); //统计表中学生个数
void tips();//提示引导用户端操作
int main()
{
List list;//学生信息顺序表
int n;//学生数量
int choose = 0;//项目选择
puts(" 欢迎进入学生管理系统 ");
cout << "请初始化学生信息,输入学生数量:";
cin >> n;
InitList(n, list);
tips();
cout << "请输入您想进行的操作:";
cin >> choose;
while (true)
{
if (choose == 7) break;
switch (choose)
{
case 1: //逐个显示学生表中所有学生的相关信息;
{
Show(list);
break;
}
case 2: //根据姓名进行查找,返回此学生的学号和成绩;
{
string name;
cout << "请输入查找姓名:";
cin >> name;
Find(name, list);
break;
}
case 3: //根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
{
int pos;
cout << "请输入查找位置:";
cin >> pos;
Position(pos, list);
break;
}
case 4://给定一个学生信息,插入到表中指定的位置;
{
Student stu;
cout << "输入新学生信息" << endl;
cout << "请输入姓名:";
cin >> stu.name;
cout << "请输入学号:";
cin >> stu.num;
cout << "请输入成绩:";
cin >> stu.price;
cout << "该学生信息录入完成" << endl;
int pos;
cout<<("请输入插入位置:");
cin >> pos;
Insert(pos, list, stu);
break;
}
case 5://删除指定位置的学生记录;
{
int pos;
cout << ("请输入删除位置:");
cin >> pos;
Delete(pos, list);
break;
}
case 6://统计表中学生个数。
{
cout << "学生总人数为:" << Length(list) << endl;
break;
}
default://输入错误情况处理
{
puts("输入错误,请重新输入");
break;
}
}
cout << "请输入您仍想进行的操作:";
cin >> choose;
}
cout << "退出成功,欢迎下次使用!" << endl;
}
void InitList(int n,List &list)//根据指定学生个数,逐个输入学生信息
{
list.student = new Student[maxsize*sizeof(Student)];//创建学生数据最大可能所需的空间大小
list.length = n;//元素个数
puts("开始初始化学生信息");
for (int i = 0; i < n; i++)//依次输入学生数据
{
cout << "输入新学生信息" << endl;
cout << "请输入姓名:";
cin >> list.student[i].name;
cout << "请输入学号:";
cin >> list.student[i].num;
cout << "请输入成绩:";
cin >> list.student[i].price;
cout<<"该学生信息录入完成" << endl;
}
}
void Show(List &list)//显示所有学生信息
{
cout << "学生信息表" << endl;
cout << "学号" << setw(6) << "姓名" << setw(6) << "成绩" << endl;
for (int i = 0; i < list.length; i++)//依次输出学生数据
{
cout << list.student[i].num << setw(8) << list.student[i].name << setw(8) << list.student[i].price << endl;
}
}
void Find(string name,List &list)//根据姓名进行查找,返回此学生的学号和成绩
{
int i = 0;
while (i<list.length)
{
if (name.compare(list.student[i].name)==0)//判断是否有相互匹配的名字
{
cout << "学号" << setw(6) << "姓名" << setw(6) << "成绩" << endl;//找到相匹配学生,输出信息
cout << list.student[i].num << setw(8) << list.student[i].name << setw(6) << list.student[i].price << endl;
break;
}
if (i == list.length-1) //到最后一个数仍然无法找到,则查无此人
{
cout << "查无此人,请重新输入" << endl;
break;
}
i++;
}
}
void Position(int pos, List &list) //根据指定的位置可返回相应的学生信息(学号,姓名,成绩)
{
if (pos >= list.length || pos < 0) cout << "位置输入错误,请保证该位置大于0且小于学生人数" << endl;//输入位置错误处理
else//正确位置输出信息
{
cout << "学号" << setw(6) << "姓名" << setw(6) << "成绩" << endl;
cout << list.student[pos-1].num << setw(8) << list.student[pos-1].name << setw(6) << list.student[pos-1].price << endl;
}
}
void Insert(int pos, List &list,Student stu)//给定一个学生信息,插入到表中指定的位置
{
if (pos > list.length || pos < 0) cout << "位置输入错误,请保证该位置大于0且小于学生人数" << endl;
else
{
for (int i = list.length; i > pos-1; i--)//插入位置后每一位向后移动一位
{
list.student[i] = list.student[i - 1];
}
list.student[pos-1] = stu;//将学生信息插入位置
list.length++;//学生数量加1
cout << "插入学生信息成功!" << endl;
}
}
void Delete(int pos, List &list)//删除指定位置的学生记录
{
if (pos >= list.length || pos < 0) cout << "位置输入错误,请保证该位置大于0且小于学生人数" << endl;
else
{
for (int i = pos-1; i < list.length; i++)//覆盖该位置的值,位置后所有值向前移动一位
{
list.student[i] = list.student[i + 1];
}
list.length--;//学生数量减一
cout << "该学生信息删除成功!" << endl;
}
}
int Length(List &list) //统计表中学生个数
{
return list.length;
}
void tips()
{
puts("请根据指引进行操作");
puts("输入1,逐个显示学生表中所有学生的相关信息");
puts("输入2,根据姓名进行查找,返回此学生的学号和成绩");
puts("输入3,根据指定的位置可返回相应的学生信息(学号,姓名,成绩)");
puts("输入4,给定一个学生信息,插入到表中指定的位置");
puts("输入5,删除指定位置的学生记录");
puts("输入6,统计表中学生个数");
puts("输入7,退出");
}