实验内容:
定义一个包含学生信息(学号,姓名,成绩)的单链表,使其具有如下功能:
(1) 根据指定学生个数,逐个输入学生信息;
(2) 逐个显示学生表中所有学生的相关信息;
(3) 根据姓名进行查找,返回此学生的学号和成绩;
(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
(5) 给定一个学生信息,插入到表中指定的位置;
(6) 删除指定位置的学生记录;
(7) 统计表中学生个数。
LinkList.h
#include <cstddef>
#include <iostream>
#include <string.h>
#define OK 1
#define ERROR 0
typedef char ElemType;
typedef int Status;
using namespace std;
typedef struct {
char no[8]; //8位学号
char name[20]; //姓名
int grade; //成绩
}Student;
typedef struct LNode{
Student data; //结点数据域
struct LNode *next; //结点指针域
}LNode,*LinkList; //LinkList为指向结构体的LNode的指针类型
//初始化
Status InitList(LinkList &L){
//构造一个空的单链表L
L = new LNode; //生成新的结点作为头结点,用头指针L指向头节点
L->next = NULL; //头结点的指针域置空
return OK;
}
//创建单链表--前插法
void CreateList_H(LinkList &L, int n){
int i, grade;
char no[8], name[20];
for(i = 0; i < n; i++){
LNode *p = new LNode;
cout << "请输入学生学号,姓名,成绩!" << endl;
cin >> no >> name >> grade;
strcpy(p->data.no, no);
strcpy(p->data.name, name);
p->data.grade = grade;
p->next = L->next;
L->next = p;
}
}
//创建单链表--后插法
void CreatrList_R(LinkList &L, int n){
int i, grade;
char no[8], name[20];
LNode *r = L;
for(i = 0; i < n; i++){
LNode *p = new LNode;
cout << "请输入学生学号,姓名,成绩!" << endl;
cin >> no >> name >> grade;
strcpy(p->data.no, no);
strcpy(p->data.name, name);
p->data.grade = grade;
p->next = NULL;
r->next = p;
r = p;
}
}
//
//取值
LNode *GetElem(LinkList L, int i){
//在带头结点的单链表L中根据序号i获取元素的值,用e返回第i个数据元素的值
LNode *p = L->next;
int j = 1;
while(p&&j<i){
p = p->next;
++j;
}
if(!p || j > i) return ERROR;
return p;
}
//
//查找
LNode *LocateElem(LinkList L, ElemType *e){
//在带头结点的单链表L中查找值为e的元素
LNode *p = L->next;
while(p && strcmp(p->data.name,e) != 0){
p = p->next;
}
return p;
}
//统计表中学生个数
int Scount(LinkList L){
LNode *p = L->next;
int count = 0;
while(p){
count++;
p = p->next;
}
return count;
}
//
//插入
int ListInsert(LinkList &L, int i,Student stu){
//在带头结点的单链表L中第i个位置插入值为e的新结点
LNode *p = L;
int j = 0;
while(p && (j < i - 1)){
p = p->next;
++j;
}
if(!p || j > i - 1) return ERROR;
LNode *s = new LNode;
s->data = stu;
s->next = p->next;
p->next = s;
return OK;
}
//
//删除
int ListDelete(LinkList &L, int i){
//在带头结点的单链表L中,删除第i个元素
LNode *p = L;
int j = 0;
while((p->next) && (j < i - 1)){
p = p->next;
++j;
}
if(!(p->next)|| (j > i -1)) return ERROR;
LNode *q = p->next;
p->next = q->next;
delete q;
return OK;
}
//
//显示
void display(LinkList L){
LNode *p = L->next;
cout << "学号" << "\t" << "姓名" << "\t" << "成绩" << endl;
while(p){
cout << p->data.no << "\t" << p->data.name << "\t" << p->data.grade <<endl;
p = p->next;
}
}
main.cpp
#include <iostream>
#include "LinkList.h"
using namespace std;
// 系统菜单
void SystemMenu(){
cout << "\n\n链表的基本操作实验" << endl;
cout << "\t1. 初始化" << endl;
cout << "\t2. 根据学生人数建立链表(前插法)" << endl;
cout << "\t3. 根据学生人数建立链表(后插法)" << endl;
cout << "\t4. 插入元素" << endl;
cout << "\t5. 删除元素" << endl;
cout << "\t6. 显示元素" << endl;
cout << "\t7. 取元素" << endl;
cout << "\t8. 查找(根据姓名)" << endl;
cout << "\t9. 退出" << endl;
cout << "\t请选择一个操作:";
}
int main() {
int item;
LinkList L;
while(true){
SystemMenu();
cin >> item;
switch(item){
case 1:
{
InitList(L);
cout << "初始化成功!" << endl;
break;
}
case 2:
{
int n;
cout << "请输入链表个数n" <<endl;
cin >> n;
CreateList_H(L,n);
cout << "链表创建成功!" << endl;
break;
}
case 3:
{
int n;
cout << "请输入链表个数n" <<endl;
cin >> n;
CreatrList_R(L,n);
cout << "链表创建成功!" << endl;
break;
}
case 4:
{
int index;
int grade;
char no[8], name[20];
Student stu;
cout << "请输入学生学号,姓名,成绩!" << endl;
cin >> no >> name >> grade;
strcpy(stu.no, no);
strcpy(stu.name, name);
stu.grade = grade;
cout << "请输入要插入的位置" << endl;
cin >> index ;
ListInsert(L,index,stu);
cout << "插入元素成功!" << endl;
break;
}
case 5:
{
int index;
cout << "请输入要删除的位置" << endl;
cin >> index;
ListDelete(L,index);
cout << "删除元素成功!" << endl;
break;
}
case 6:
{
display(L);
break;
}
case 7:
{
int index;
cout << "请输入取值位置" << endl;
cin >> index;
LNode *p = GetElem(L,index);
cout << "学号" << "\t" << "姓名" << "\t" << "成绩" << endl;
cout << p->data.no << "\t" << p->data.name << "\t" << p->data.grade << endl;
break;
}
case 8:
{
char name[20];
cout << "请输入要查找的姓名!" << endl;
cin >> name;
LNode *p = LocateElem(L,name);
cout << "学号" << "\t" << "姓名" << "\t" << "成绩" << endl;
cout << p->data.no << "\t" << p->data.name << "\t" << p->data.grade << endl;
break;
}
case 9:
{
exit(0);
}
default:
cout << "选择的操作无效!" << endl << endl;
}
}
return 0;
}