C/C++线性表的基本操作(学生信息管理)(链表&顺序表)

定义一个包含学生信息(学号,姓名,成绩)的的顺序表和链表,使其具有如下功能:
(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 (
  • 20
    点赞
  • 163
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值