数据结构 线性表实验

实验目的:
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,退出");
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 11
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
选题1:(易)实现顺序表各种基本运算的算法 参考实验指导书“实验题 1:实现顺序表各种基本运算的算法实现”。 选题2:(易)实现单链表各种基本运算的算法 参考实验指导书“实验题 2:实现单链表各种基本运算的算法实现”。 选题3:(易)编写算法实现二个有序的线性表的合并问题(存储结构可选:顺序表/单链表)。 参考课件“chap002线性表.ppt”相关例题。 选题4:(难)运用单向循环链表实现约瑟夫环的问题。 参考实验指导书“实验题 4:运用单向循环链表实现约瑟夫环的问题”。 选题5:(易)将元素X插入到链表中合适的位置。 完成习题集中的算法并编程实现:2.11。参考课件“chap002线性表习题讲解.ppt”2.11。 带头结点的单链表L,其中有n 个元素非递减有序排列,将元素X插入到链表中合适的位置。 提示:先创建链表,其中的元素值可由随机函数按阶段生成或键盘输入,先打印初始链表数据,然后插入新结点,再打印结果链表。 插入前: 插入后: 选题6:(易)删除表中所有大于mink且小于maxk的元素。 已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析你的算法的时间复杂度(注意:mink和maxk是给定的两个参变量,它们的值为任意的整数)。 参考实验指导书“实验题 5:删除有序单链表中所有大于 mink 且小于 maxk的元素”。 选题7:(中等)删除单链表中多余元素。 完成习题集中的算法并编程实现:2.20。参考课件“chap002线性表习题讲解.ppt”2.20。 已知单链表中的元素有序,写一算法,删除表中所有值相同的多余元素(使操作后线性表中的元素值均不相同),同时释放被删结点空间。 选题8:(易)实现单链表的就地逆置。 完成习题集中的算法并编程实现:2.22。参考课件“chap002线性表习题讲解.ppt”2.22。 试分别以不同的存储结构实现线性表的就地逆置算法,即在原表的存储空间将线性表(a1,a2...,an)逆置为(an,an-1,...,a1)。 选题9:(难)单链表拆分。 将带头结点的单链表LA中分拆成LB和LC两条单链表,LA中的data域为奇数的节点依次进入LB,而为偶数的节点进入LC。 参考课件“chap002线性表习题讲解.ppt”第35页例题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值