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

  • Post author:
  • Post category:其他


定义一个包含学生信息(学号,姓名,成绩)的的顺序表和链表,使其具有如下功能:

(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 ((n + S.length) < 0 || (n + S.length) > MAXSIZEList) { cout << "error: amount is illegal !!!"; return; }

	cout << "\nimport " << n << " student : number(7)  name(20)  score( 0 - 150 分 ) :\n";
	
	while (n) 
	{
		cin >> S.data[S.length].no >> S.data[S.length].name >> S.data[S.length].score;
		if (CkS(S, S.data[S.length],-1)) { 
		cout << "\ncontinue to import " << n << " student : number(7)  name(20)  score :\n";
		continue; }
		while (S.data[S.length].score > 150 || S.data[S.length].score < 0)
		{
			cout << "\nerror: the score is overflow(0-150) \nimport the score again:";
			cin >> S.data[S.length].score;
		}
		S.length++;
		n--;
	}
	cout << "all the data have saved ! ";
}

*//查看表中所有学生信息*
void OPuS(SqList &S)
{
	if (S.length == 0) { cout << "\n  it is an empty List !\n"; return; }
	cout << "\nthe list of student :\n"<<endl<<"number\t\t"<<"name\t\t"<<"score\n";
	int n = 0;
	while (n < S.length) {
		cout <<S.data[n].no << "\t\t" << S.data[n].name << "\t\t" << S.data[n].score << endl;
		n++;
	}
	cout << endl;
}

*//按姓名查找学生*
void NaSeaS(SqList &S)
{
	if (S.length == 0) { cout << "\nsorry ! no data !\n"; return; }
	cout << "\nthe name of the student : ";
	
	char ch[21];
	int n = 0;
	bool flag =false;
	bool flag1 = false;
	cin >> ch;
	while (n < S.length)
	{
		if (!(flag || flag1)) { cout << "\nthe related students : \n" << endl << "number\t\t" << "name\t\t" << "score\n"; }
		if (!strcmp(ch,S.data[n].name)) { 
			cout << endl << S.data[n].no << "\t\t" << S.data[n].name << "\t\t" << S.data[n].score; 
		    flag = true; }
		n++;
	}
	if (!flag) { cout << "\nsorry ! there is no this student !\n"; }
}
void DelS(SqList &S)
{
	if (S.length == 0) { cout << "\nsorry ! no data !\n"; return; }
	cout << "\nthe position of the student : (between 1 and "<<S.length<<" )";
	int n;
	cin >> n;
	if (n>S.length||n<1) { cout << "\nerror: it is illegal !\n"; return; }
	while (n < S.length)
	{
		S.data[n - 1] = S.data[n];
		n++;
	}
	S.length--;
	cout << "\nDeleted successfully ! \n";
}

*//在表中某个位置插入学生信息*
void InSerS(SqList &S) 
{
	if (S.length == MAXSIZEList) { cout << "\nwarning: The list is full !\n"; return; }
	cout << "\nchoose the position between 1 and " << S.length + 1<<": "<<endl;
	int n;
	cin >> n;
	if (n<1 || n>S.length + 1) { cout << "error: it is illegal !\n"; return; }
	for (int t = S.length + 1 - n; t > 0; t--)
	{
		S.data[t + n] = S.data[t + n - 1];
	}
	cout << "\nimport the ( number(7) name(20) score(0-150) ):";
	do {
		cin >> S.data[n - 1].no >> S.data[n - 1].name >> S.data[n - 1].score;
		
	} while (CkS(S, S.data[n - 1],n-1));
	while (S.data[n - 1].score > 150 || S.data[n - 1].score < 0)
	{
		cout << "\nthe score is overflow(0-150)\nimport the score again:";
		cin >> S.data[n - 1].score;
	}
	S.length++;
	cout << " \nthis student have saved !!! \n";
}

*//统计总人数*
void SumS(SqList &S)
{
	cout << "\nthe amount of the student in the list : " << S.length << endl;
}
*//链表*
//排重学号函数
bool CkL(LinkList &L,student st)
{
	LinkList p = L->next;
	while (p)
	{
		if (!strcmp(p->data.no, st.no)) 
		{ cout << "\nthe number " << st.no << " is occupied !\n"; return true;
		}
		p = p->next;
	}
	return false;
}

//录入学生信息
void IPuL(LinkList &L)
{
	cout << "\nthe amount of data : ";
	int n;
	cin >> n;
	L->data.score += n;
	if (n < 0) { cout << "error: import the number is illegal !"; return; }
	LNode *p = L;
	cout << "import " << n << " data:  number(7)  name(20)  score( 0 - 150 分 )\n";
	while (n)
	{
		LNode *q = new LNode;
		InitL(q);
		cin >> q->data.no >> q->data.name >> q->data.score;
		if(CkL(L,q->data)){ cout << "continue to import " << n << " data:  number(7)  name(20)  score( 0 - 150 分 )\n"; }
		while (q->data.score > 150 || q->data.score < 0)
		{
			cout << "\nthe score is overflow(0-150)\nimport the score agian:";
			cin >> q->data.score;
		}
		p->next = q;
		p = q;
		n--;
	}
	cout << "all the data have saved ! \n";
}

//查看整个表的学生信息
void OPuL(LinkList &L)
{
	if (L->data.score==0) { cout << "\nit is an empty List ! "; return; }
	cout << "\nthe list of student :\n" << endl << "number\t\t" << "name\t\t" << "score\n";
	LinkList p = L->next;
	while (p!=NULL)
	{
		
		cout << p->data.no << "\t\t" << p->data.name << "\t\t" << p->data.score << endl;
		p = p->next;
	}
}

//按姓名查找学生信息
void NaSeaL(LinkList &L)
{
	if (L->data.score == 0) { cout << " \nit is an empty List !\n "; return; }
	char ch[21];
	bool flag = true;

	cout << "\nthe name of the student : ";
	cin >> ch;
	LinkList p = L->next;
	cout << "this is the list :" << endl << "number\t\t" << "name\t\t" << "score\n";
	while (p!=NULL)
	{
		if (!strcmp(ch, p->data.name))
		{
			cout << p->data.no << "\t\t" << p->data.name << "\t\t" << p->data.score << endl;
			flag =false;
		}
		 
		p = p->next;
	}
	if (flag) { cout << "sorry! no such student ! \n"; }
}

//删除学生信息
void DelL(LinkList &L)
{
	if (L->data.score == 0) { cout << "\n it is an empty List ! \n"; return; }
	cout << "\nthe position of the student :";
	int n;
	cin >> n;
	LinkList p = L->next;
	while (n-2)
	{
		if (!p) { cout << "\nerror: the list is not so long !\n"; return; }
		p = p->next;
		n--;
	}
	if (!(n - 2)) { p->next = p->next->next; p = p->next; delete p; --L->data.score; cout << "\nDelete successfully !\n"; }
}

//选择某个位置插入学生信息
void InSerL(LinkList &L)
{
	cout << "\nchooose the position between 1 and " << L->data.score+1<<endl;
	int n;
	cin >> n;
	if (n<1 || n>L->data.score + 1) { cout << "\nerror: this operation is overflow !\n"; return; }
	LinkList p=L;
	
	while(n-1)
	{
		p = p->next;
		n--;
	}
	LNode *q = new LNode;
	cout << "\nimport the student( number(7) name(20) score( 0 - 150 分 ) ): ";
	cin >> q->data.no >> q->data.name >> q->data.score;
	while (CkL(L, q->data)) 
	{
		cout << "\nplease import again ( number(7) name(20) score( 0 - 150 分 ) ): ";
		cin >> q->data.no >> q->data.name >> q->data.score;
	}
	while (q->data.score > 150 || q->data.score < 0)
	{
		cout << "\nthe score is overflow( 0 - 150 分 )\nimport the score again: ";
		cin >> q->data.score;
	}
	q->next = p->next;
	p->next = q;
	L->data.score++;
	cout << " \nthis student have saved !!! \n";
}

//统计学生人数
void SumL(LinkList &L)
{
	cout << "\nthe amount of the student in the list : " << L->data.score << endl;
}

//主函数的排布

int main()
{   char choice;
	SqList S;
	InitS(S);
	LNode * L = new LNode;
	InitL(L);
	L->data.score = 0;
	do
	{
		InterFace();
		cin >> choice;
		switch (choice)
		{
		case '0':break;
		case '1':char a;
			do
			{
				InterFaceS();
				cin >> a;
				switch (a)
				{
				case '0':break;
				case '1':IPuS(S); break;
				case '2':OPuS(S); break;
				case '3':NaSeaS(S); break;
				case '4':DelS(S); break;
				case '5':InSerS(S); break;
				case '6':SumS(S); break;
				default:cout << "\nerror: please choose the right command !\n";
				}
			} while (a!='0');
			break;
		case '2':char b;
			do
			{
				InterFaceL();
				cin >> b;
				switch (b)
				{
				case '0':break;
				case '1':IPuL(L); break;
				case '2':OPuL(L); break;
				case '3':NaSeaL(L); break;
				case '4':DelL(L); break;
				case '5':InSerL(L); break;
				case '6':SumL(L); break;
				default:cout << "\nplease choose the right command !\n";
				}
			} while (b!='0');
			break;
		default:cout << "\nplease make a right choose !\n";
		}
	} while (choice!='0');

	return 0;
}



版权声明:本文为Y_xy_9原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。