学生信息管理系统(链表&&C语言)

1.头文件和预处理

#include <stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#include<stdbool.h>
#include<iostream>
using namespace std;
#define NO_LENGTH  20
#define NAME_LENGTH 11

2.定义学生结构体的数据结构

typedef struct Student{
	char studentNo[NO_LENGTH];
	char studentName[NAME_LENGTH];
	int score;
}st;

3.定义每条记录或节点的数据结构

/* 定义每条记录或节点的数据结构 */
typedef struct node
{
	struct Student data; //数据域
	struct node *next; //指针域
}Node,*Link;  //Node为node类型的别名,Link为node类型的指针别名

4.函数接口代码.

1.定义提示菜单

//定义提示菜单
void myMenu(){

	printf("*****************************菜单*****************************n"); 
	printf("***********************1 增加学生记录*************************n"); 
	printf("***********************2 删除学生记录*************************n"); 
	printf("***********************3 查找学生记录*************************n"); 
	printf("***********************4 修改学生记录*************************n"); 
	printf("***********************5 统计学生人数 ************************n"); 
	printf("***********************6 显示学生记录*************************n"); 
	printf("***********************7 退出系统 ****************************n"); 
	
}

2.增加学生记录

void inputStudent(Link l){
	 printf("请输入学生学号:");
	 scanf("%s",l->data.studentNo);
	 printf("请输入学生的姓名:");
	 scanf("%s",l->data.studentName);
	printf("请输入学生的成绩:");
	 scanf("%s",&(l->data.score));
	 //每个新创建的节点的next域都初始化为NULL
	 l->next = NULL;
	 system("cls");
}

3.输入学号接口·

void inputStudentNo(char s[],char no[]){
	printf("请输入要%s的学生学号:",s);
	scanf("%s",no);
}

4.遍历表中学生

//遍历表中学生 
void displayNode(Link head){
	if(head==NULL)
	{
		printf("学生为空n");
		return; 
	}
	else
	{
		Link p=head->next;
		while(p)
		{
			cout<<"姓名:"<<p->data.studentName<<"    学号"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
			p=p->next;
		}
		
	}
   // 填写代码,根据传入的链表head头指针,扫描链表显示所有节点的信息
   system("pause");
   system("cls");
}

5.增加学生记录

/* 增加学生记录 */
bool addNode(Link head){
	 Link p,q;   //p,q两个节点一前一后
	 Link node;  //node指针指向新创建的节点
	 node=(Link)malloc(sizeof(Node));
	 inputStudent(node);

	 q = head;
	 p = head->next;  //q指向head后面的第一个有效节点
	 if(head->next==NULL)
		 //链表为空时
		head->next = node;
	 else {
		 //循环访问链表中的所有节点
		while(p != NULL){
			if (node->data.studentNo < p->data.studentNo){
				//如果node节点的学号比p节点的学号小,则插在p的前面,完成插入后,提前退出子程序
				q->next = node;
				node->next = p;
				return true;
			}
			else{
				//如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持pq一前一后)
				q = p;
				p = p->next;

			}
		}
		//如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面
		q->next = node;

	}
	 return true;
	 system("pause");
   system("cls");
}

6.删除学生信息

//删除学生信息
bool deleteNode(Link head){
    // 按照给定的学号删除学生记录,如果删除成功返回true,如果没找到学号返回false

    //输入要处理的学号
    	char no[NO_LENGTH];
	inputStudentNo("删除",no);
		Link p=head->next;
	Link q=head;
	while(p)
	{
		if(strcmp(p->data.studentNo,no)==0)
		{
			q->next=p->next;
			free(p);
			system("pause");
   system("cls");
			return true;
		}
		else
		{
			q=p;
			p=p->next;
		}
	}
system("pause");
   system("cls");
	return false;
}

7.查找学生信息

//查找学生信息 
bool queryNode(Link head){
    // 按照给定的学号查询学生记录,如果查找成功返回true,如果没找到学号返回false

    //输入要处理的学号
	char no[NO_LENGTH];
	inputStudentNo("查找",no);
		Link p=head->next;
	while(p)
	{
		if(strcmp(p->data.studentNo,no)==0)
		{
			
   			system("cls");
   			cout<<"姓名:"<<p->data.studentName<<"    学号"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
			return true;
		}
		else
		{
			p=p->next;
		}
	}
   system("cls");

	return false;
}

8.修改学生信息

//修改学生信息 
bool modifyNode(Link head){
    // 按照给定的学号找到学生记录节点,如果修改成功返回true,如果没找到学号返回false
	
    //输入要处理的学号
	char no[NO_LENGTH];
	inputStudentNo("修改",no);
	Link p=head->next;
	while(p)
	{
		if(strcmp(p->data.studentNo,no)==0)
		{
			cout<<"请输入修改后的姓名"<<endl; 
			cin>>p->data.studentName;
			cout<<"请输入修改后的学号"<<endl; 
			cin>>p->data.studentNo;
			cout<<"请输入修改后的成绩"<<endl; 
			cin>>p->data.score;
			system("cls");
			return true;
		}
		else
		{
			p=p->next;
		}
	}
	system("cls");
	return false;
}

9.统计学生人数

//统计学生人数
int countNode(Link head){
	//统计学生人数,扫描链表统计节点个数,返回节点数
	Link p;
	int count = 0;
	p = head->next;
	while(p)
	{
		p=p->next;
		count++;
	}
	//填充代码
	system("cls");
	return count;
}

10.清空链表

//清空链表 
void clearLink(Link head){
	Link q,p;
	p=head->next;
	q=head;
	while(p)
	{
		q->next=p->next;
		free(p);
		p=q->next;
	}
        //遍历链表,用free语句删除链表中用malloc建立起的所有的节点
}

5.main函数

int main() {
	int select;
    	int count;
	Link head;  // 定义链表

	//建立head头结点,在这个程序中head指向头结点,头结点data部分没有内容,其后续节点才有真正的数据
	head = (Link)malloc(sizeof(Node));
	head->next = NULL;

	while(1)
	{
		myMenu();
		printf("n请输入你的选择(0-7):");  //显示提示信息
		scanf("%d",&select);
		switch(select)
		{
		case 1:
			//增加学生记录
			if(addNode(head))
				printf("成功插入一个学生记录。nn");
			break;
		case 2:
			//删除学生记录
			if(deleteNode(head))
				printf("成功删除一个学生记录。nn");
			else
				printf("没有找到要删除的学生节点。nn");
			break;
		case 3:
			//查询学生记录
			if(queryNode(head))
				printf("成功找到学生记录。nn");
			else
				printf("没有找到要查询的学生节点。nn");
			break;
		case 4:
			//修改学生记录
			if(modifyNode(head))
				printf("成功修改一个学生记录。nn");
			else
				printf("没有找到要修改的学生节点。nn");
			break;
		case 5:
			//统计学生人数
			count = countNode(head);
			printf("学生人数为:%dnn",count);
			break;
		case 6:
			//显示学生记录
			displayNode(head);
			break;
		case 7:
			//退出前清除链表中的所有结点
            clearLink(head);
			return 0;
		default:
			printf("输入不正确,应该输入0-7之间的数。nn");
			system("cls"); 
			break;
		}
	}
	return 0;
}

6.总源码(可直接复制运行)

#include <stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#include<stdbool.h>
#include<iostream>
using namespace std;
#define NO_LENGTH  20
#define NAME_LENGTH 11

/* 定义学生结构体的数据结构 */
typedef struct Student{
	char studentNo[NO_LENGTH];
	char studentName[NAME_LENGTH];
	int score;
}st;

/* 定义每条记录或节点的数据结构 */
typedef struct node
{
	struct Student data; //数据域
	struct node *next; //指针域
}Node,*Link;  //Node为node类型的别名,Link为node类型的指针别名

//定义提示菜单
void myMenu(){

	printf("*****************************菜单*****************************n"); 
	printf("***********************1 增加学生记录*************************n"); 
	printf("***********************2 删除学生记录*************************n"); 
	printf("***********************3 查找学生记录*************************n"); 
	printf("***********************4 修改学生记录*************************n"); 
	printf("***********************5 统计学生人数 ************************n"); 
	printf("***********************6 显示学生记录*************************n"); 
	printf("***********************7 退出系统 ****************************n"); 
	
}

void inputStudent(Link l){
	 printf("请输入学生学号:");
	 scanf("%s",l->data.studentNo);
	 printf("请输入学生的姓名:");
	 scanf("%s",l->data.studentName);
	printf("请输入学生的成绩:");
	 scanf("%d",&(l->data.score));
	 //每个新创建的节点的next域都初始化为NULL
	 l->next = NULL;
	 system("cls");
}

void inputStudentNo(char s[],char no[]){
	printf("请输入要%s的学生学号:",s);
	scanf("%s",no);
}
//遍历表中学生 
void displayNode(Link head){
	if(head==NULL)
	{
		printf("学生为空n");
		return; 
	}
	else
	{
		Link p=head->next;
		while(p)
		{
			cout<<"姓名:"<<p->data.studentName<<"    学号"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
			p=p->next;
		}
		
	}
   // 填写代码,根据传入的链表head头指针,扫描链表显示所有节点的信息
   system("pause");
   system("cls");
}

/* 增加学生记录 */
bool addNode(Link head){
	 Link p,q;   //p,q两个节点一前一后
	 Link node;  //node指针指向新创建的节点
	 node=(Link)malloc(sizeof(Node));
	 inputStudent(node);

	 q = head;
	 p = head->next;  //q指向head后面的第一个有效节点
	 if(head->next==NULL)
		 //链表为空时
		head->next = node;
	 else {
		 //循环访问链表中的所有节点
		while(p != NULL){
			if (node->data.studentNo < p->data.studentNo){
				//如果node节点的学号比p节点的学号小,则插在p的前面,完成插入后,提前退出子程序
				q->next = node;
				node->next = p;
				return true;
			}
			else{
				//如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持pq一前一后)
				q = p;
				p = p->next;

			}
		}
		//如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面
		q->next = node;

	}
	 return true;
	 system("pause");
   system("cls");
}

bool deleteNode(Link head){
    // 按照给定的学号删除学生记录,如果删除成功返回true,如果没找到学号返回false

    //输入要处理的学号
    	char no[NO_LENGTH];
	inputStudentNo("删除",no);
		Link p=head->next;
	Link q=head;
	while(p)
	{
		if(strcmp(p->data.studentNo,no)==0)
		{
			q->next=p->next;
			free(p);
			system("pause");
   system("cls");
			return true;
		}
		else
		{
			q=p;
			p=p->next;
		}
	}
system("pause");
   system("cls");
	return false;
}

//查找学生信息 
bool queryNode(Link head){
    // 按照给定的学号查询学生记录,如果查找成功返回true,如果没找到学号返回false

    //输入要处理的学号
	char no[NO_LENGTH];
	inputStudentNo("查找",no);
		Link p=head->next;
	while(p)
	{
		if(strcmp(p->data.studentNo,no)==0)
		{
			
   			system("cls");
   			cout<<"姓名:"<<p->data.studentName<<"    学号"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
			return true;
		}
		else
		{
			p=p->next;
		}
	}
   system("cls");

	return false;
}

//修改学生信息 
bool modifyNode(Link head){
    // 按照给定的学号找到学生记录节点,如果修改成功返回true,如果没找到学号返回false
	
    //输入要处理的学号
	char no[NO_LENGTH];
	inputStudentNo("修改",no);
	Link p=head->next;
	while(p)
	{
		if(strcmp(p->data.studentNo,no)==0)
		{
			cout<<"请输入修改后的姓名"<<endl; 
			cin>>p->data.studentName;
			cout<<"请输入修改后的学号"<<endl; 
			cin>>p->data.studentNo;
			cout<<"请输入修改后的成绩"<<endl; 
			cin>>p->data.score;
			system("cls");
			return true;
		}
		else
		{
			p=p->next;
		}
	}
	system("cls");
	return false;
}

//统计学生人数
int countNode(Link head){
	//统计学生人数,扫描链表统计节点个数,返回节点数
	Link p;
	int count = 0;
	p = head->next;
	while(p)
	{
		p=p->next;
		count++;
	}
	//填充代码
	system("cls");
	return count;
}

//清空链表 
void clearLink(Link head){
	Link q,p;
	p=head->next;
	q=head;
	while(p)
	{
		q->next=p->next;
		free(p);
		p=q->next;
	}
        //遍历链表,用free语句删除链表中用malloc建立起的所有的节点
}

int main() {
	int select;
    	int count;
	Link head;  // 定义链表

	//建立head头结点,在这个程序中head指向头结点,头结点data部分没有内容,其后续节点才有真正的数据
	head = (Link)malloc(sizeof(Node));
	head->next = NULL;

	while(1)
	{
		myMenu();
		printf("n请输入你的选择(0-7):");  //显示提示信息
		scanf("%d",&select);
		switch(select)
		{
		case 1:
			//增加学生记录
			if(addNode(head))
				printf("成功插入一个学生记录。nn");
			break;
		case 2:
			//删除学生记录
			if(deleteNode(head))
				printf("成功删除一个学生记录。nn");
			else
				printf("没有找到要删除的学生节点。nn");
			break;
		case 3:
			//查询学生记录
			if(queryNode(head))
				printf("成功找到学生记录。nn");
			else
				printf("没有找到要查询的学生节点。nn");
			break;
		case 4:
			//修改学生记录
			if(modifyNode(head))
				printf("成功修改一个学生记录。nn");
			else
				printf("没有找到要修改的学生节点。nn");
			break;
		case 5:
			//统计学生人数
			count = countNode(head);
			printf("学生人数为:%dnn",count);
			break;
		case 6:
			//显示学生记录
			displayNode(head);
			break;
		case 7:
			//退出前清除链表中的所有结点
            clearLink(head);
			return 0;
		default:
			printf("输入不正确,应该输入0-7之间的数。nn");
			system("cls"); 
			break;
		}
	}
	return 0;
}

7.测试结果

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

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

在这里插入图片描述

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>