北京理工大学珠海学院实验报告ZHUHAI CAMPAUS OF BEIJING INSTITUTE OF TECHNOLOGY一、实验内容定义一个包含学生信息(学号,姓名,成绩)的的顺序表和链表,使其具有如下功能:(1) 根据指定学生个数,逐个输入学生信息;(2) 逐个显示学生表中所有学生的相关信息;(3) 根据姓名进行查找,返回此学生的学号和成绩;(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);(5) 给定一个学生信息,插入到表中指定的位置;(6) 删除指定位置的学生记录;(7) 统计表中学生个数。
二、实验要求:(1) 程序要添加适当的注释,程序的书写要采用缩进格式。
(2) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应,如插入删除时指定的位置不对等等。
(3) 程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。
(4) 根据实验报告模板详细书写实验报告,在实验报告中给出链表根据姓名进行查找的算法和插入算法的流程图。
(5) 上传源程序和实验报告到教师机的相应班级所在文件夹。
顺序表的源程序保存为SqList.cpp,链表的源程序保存为LinkList.cpp,实验报告命名为:实验报告1.doc。
源程序和实验报告压缩为一个文件(如果定义了头文件则一起压缩),按以下方式命名:15数字媒体技术X班——学号——姓名.rar,如15数字媒体技术X班070814101薛力.rar。
二、程序实现(内容、步骤、程序)顺序表#include<malloc.h>#include<iostream>#include<stdlib.h>#include<string.h> using namespace std;#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2 typedef int Status;typedef struct{char no[8];char name[10];int price;}Student;// Student为学生信息类型#define ListSizeFirst 10 // L的初始分配量#define ListSizeAdd 2 // L的分配增量typedef struct{Student *elem;int length;int listsize;}SqList;void InitList(SqList &L) // 构造空的顺序表L{L.elem = (Student*)malloc(ListSizeFirst * sizeof(Student));if (!L.elem)exit(OVERFLOW);L.length = 0;L.listsize = ListSizeFirst; // 初始化存储容量}int ListLength(SqList L) // L中有多少个数据元素个数{return L.length;}Status GetElem(SqList L, int i, Student &e) // 返回L中第i个数据元素的值{if (i<1 || i>L.length) // 如果i不在L的范围之内就报错return ERROR;e = *(L.elem + i - 1); // 将L的第i个元素的值赋给ereturn OK;}int LocateElem(SqList L, Student e, Status(*namecompare)(Student, Student)) // 返回L里面第1个与e满足名字相同的元素的位序。
{int i = 1; // 比较元素的次序Student *p = L.elem; // 比较元素的地址while (i <= L.length && !namecompare(*p++, e)) // 还没找到满足关系的数据元素++i;if (i <= L.length)return i; // 找到满足关系的数据元素就返回其位序elsereturn 0;}Status ListInsert(SqList &L, int i, Student e) // 在L中第i个位置前面插入数据元素e,L长度加1{Student *newbase, *q, *p;if (i<1 || i>L.length + 1)return ERROR;if (L.length == L.listsize) // 存储空间满了{newbase = (Student*)realloc(L.elem, (L.listsize + ListSizeAdd) * sizeof(Student));L.elem = newbase; // 新地址L.listsize += ListSizeAdd; // 加长度}q = L.elem + i - 1; // 插入位置for (p = L.elem + L.length - 1;p >= q;--p) // 元素右移*(p + 1) = *p;*q = e; // 插入e++L.length;// 表长增1return OK;}Status ListDelete(SqList &L, int i, Student &e) //删除L的第i个数据元素并返回{Student *p, *q;if (i<1 || i>L.length)return ERROR;p = L.elem + i - 1; // 被删位置e = *p;q = L.elem + L.length - 1;for (++p;p <= q;++p) // 被删元素之后的元素向左移动*(p - 1) = *p;L.length--;return OK;}void ListTraverse(SqList L, void(*print)(Student&)) // 从表L的第1个元素到最后1个元素都调用print{Student *p = L.elem;int i;for (i = 1;i <= L.length;i++)print(*p++);cout << "\n";}void print(Student &c) //遍历输出学生信息{printf("%s\t %s\t %d\t\n", c.no, , c.price);}Status namecompare(Student c1, Student c2) //根据学生名字比较函数{if (strcmp(, ) == 0)return TRUE;elsereturn FALSE;}void main(){int k, n, i, j, len;SqList L;Student e;InitList(L);while (1){cout << "学生成绩管理\n";cout << "\n";cout << "1.根据指定学生个数,逐个输入学生信息\n";cout << "2.逐个显示学生表中所有学生的相关信息\n";cout << "3.根据姓名进行查找,返回此学生的学号和成绩\n";cout << "4.根据指定的位置可返回相应的学生信息(学号,姓名,成绩)\n";cout << "5.给定一个学生信息,插入到表中指定的位置\n";cout << "6.删除指定位置的学生记录\n";cout << "7.统计表中学生个数\n";cout << "\n";cout << "请输入你的选择:\n";cin >> k;switch (k){case 1:cout << "请输入学生人数:\n";cin >> n;for (int i = 1;i <= n;i++){cout << "请录入第" << i << "个学生信息\n";cout << "输入学生学号:\n";cin >> e.no;cout << "输入学生姓名:\n";cin >> ;cout << "输入学生成绩:\n";cin >> e.price;ListInsert(L, i, e);}break;case 2:cout << "学号\t姓名\t成绩\t\n";ListTraverse(L, print);break;case 3:cout << "输入要查找学生的姓名:\n";cin >> ;j = LocateElem(L, e, namecompare);if (j){GetElem(L, j, e);cout << "学号\t姓名\t成绩\t\n";print(e);}elsecout << "没有符合条件的元素\n";break;case 4:cout << "输入待查找的学生的位置:\n";cin >> i;j = GetElem(L, i, e);if (j){GetElem(L, i, e);cout << "学号\t姓名\t成绩\t\n";print(e);}elsecout << "查找失败!\n";break;case 5:cout << "输入待插入学生的位置:\n";cin >> i;cout << "输入待插入学生的学号:\n";cin >> e.no;cout << "输入学生姓名:\n";cin >> ;cout << "输入学生成绩:\n";cin >> e.price;ListInsert(L, i, e);break;case 6:cout << "输入待删除学生的位置:\n";cin >> i;j = GetElem(L, i, e);if (j){ListDelete(L, i, e);cout << "删除成功,删除学生为:\n";cout << "学号\t姓名\t成绩\t\n";print(e);}.elsecout << "没有该位置,无法删除!\n";break;case 7:len = ListLength(L);cout << "表中学生个数为" << len << "个";cout << "\n";break;case 0:exit(0);default:cout << "选择错误,重新开始!\n";}}}单链表#include<malloc.h>#include<iostream>#include<stdlib.h>#include<string.h>using namespace std;#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;. typedef struct{char no[8];char name[10];int price;}Student;typedef struct LNode{Student data;struct LNode *next;}LNode, *LinkList;void InitList(LinkList &L) // 初始化L{L = (LinkList)malloc(sizeof(LNode)); // 产生头结点if (!L)exit(OVERFLOW);L->next = NULL;}int ListLength(LinkList L) // 返回数据元素的个数{int i = 0;while (p){i++;p = p->next;}return i;}Status GetElem(LinkList L, int i, Student &e) // 取第i个元素赋值给e{int j = 1;LinkList p = L->next;while (p&&j<i) // 往下找知道i=p或者p为空{j++;p = p->next;}if (!p || j>i)return ERROR;e = p->data;return OK;}int LocateElem(LinkList L, Student e, Status(*compare)(Student, Student)) // 给定比较函数,查找指定元素{int i = 0;while (p){i++;if (compare(p->data, e)) // 比较得到数据元素return i;p = p->next;}return 0; // 元素不存在返回0}Status ListInsert(LinkList L, int i, Student e) // 插入元素{int j = 0;LinkList s, p = L;while (p&&j<i - 1) // 寻找第i-1个结点{j++;p = p->next;}if (!p || j>i - 1)return ERROR;s = (LinkList)malloc(sizeof(LNode)); // 生成新结点s->data = e;s->next = p->next;p->next = s;return OK;}Status ListDelete(LinkList L, int i, Student &e) // 删除第i个元素{int j = 0;LinkList q, p = L;while (p->next&&j<i - 1) // 寻找第i个结点{j++;p = p->next;}if (!p->next || j>i - 1)return ERROR;q = p->next;p->next = q->next;e = q->data;free(q);return OK;}void ListTraverse(LinkList L, void(*visit)(Student &)) // 依次对每个数据元素调用函数visit(){ //LinkList p = L->next;while (p){visit(p->data);// 对结点调用函数visit()p = p->next;}cout << "\n";}void print(Student &c) //输出结点对应学生信息{printf("%s\t %s\t %d\t\n", c.no, , c.price);}Status namecompare(Student c1, Student c2) //根据学生名字比较函数{if (strcmp(, ) == 0)return TRUE;elsereturn FALSE;}void main(){int k, n, j, i, len;LinkList L;Student e;InitList(L);while (1){cout << "学生成绩管理\n";cout << "\n";cout << "1.根据指定学生个数,逐个输入学生信息\n";cout << "2.逐个显示学生表中所有学生的相关信息\n";cout << "3.根据姓名进行查找,返回此学生的学号和成绩\n";cout << "4.根据指定的位置可返回相应的学生信息(学号,姓名,成绩)\n";cout << "5.给定一个学生信息,插入到表中指定的位置\n";cout << "6.删除指定位置的学生记录\n";cout << "7.统计表中学生个数\n";cout << "\n";cout << "请输入你的选择:\n";cin >> k;switch (k){case 1:printf("请输入学生人数:\n");cin >> n;for (i = 1;i <= n;i++){printf("请录入第%d个学生信息\n", i);printf("输入学生学号:\n");cin >> e.no;printf("输入学生姓名:\n");cin >> ;printf("输入学生成绩:\n");cin >> e.price;ListInsert(L, i, e);cout << "\n";}break;case 2:printf("学号\t姓名\t成绩\t\n");ListTraverse(L, print);cout << "\n";break;case 3:printf("输入要查找学生的名字:\n");cin >> ;j = LocateElem(L, e, namecompare);if (j){GetElem(L, j, e);printf("学号\t姓名\t成绩\t\n");print(e);}elseprintf("没有符合条件的元素\n");cout << "\n";break;case 4:cout << "输入待查找的学生的位置:\n";cin >> i;j = GetElem(L, i, e);if (j){GetElem(L, i, e);cout << "学号\t姓名\t成绩\t\n";print(e);}elsecout << "查找失败!\n";cout << "\n";break;case 5:cout << "输入待插入学生的位置:\n";cin >> i;cout << "输入待插入学生的学号:\n";cin >> e.no;cout << "输入学生姓名:\n";cin >> ;cout << "输入学生成绩:\n";cin >> e.price;ListInsert(L, i, e);cout << "\n";break;case 6:cout << "输入待删除学生的位置:\n";cin >> i;j = GetElem(L, i, e);if (j){ListDelete(L, i, e);cout << "删除成功,删除学生为:\n";cout << "学号\t姓名\t成绩\t\n";print(e);}elsecout << "没有该位置,无法删除!\n";cout << "\n";break;case 7:len = ListLength(L);cout << "表中学生个数为" << len << "个";cout << "\n";break;case 0:exit(0);default:printf("选择错误,重新开始!\n");}}}三、调试与运行顺序表:单链表:四、实验总结:1、学到了如何利用顺序表和单链表建立学生管理程序。