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

Posted Domo泷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学生信息管理系统(链表&&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("成功插入一个学生记录。\\n\\n");
			break;
		case 2:
			//删除学生记录
			if(deleteNode(head))
				printf("成功删除一个学生记录。\\n\\n");
			else
				printf("没有找到要删除的学生节点。\\n\\n");
			break;
		case 3:
			//查询学生记录
			if(queryNode(head))
				printf("成功找到学生记录。\\n\\n");
			else
				printf("没有找到要查询的学生节点。\\n\\n");
			break;
		case 4:
			//修改学生记录
			if(modifyNode(head))
				printf("成功修改一个学生记录。\\n\\n");
			else
				printf("没有找到要修改的学生节点。\\n\\n");
			break;
		case 5:
			//统计学生人数
			count = countNode(head);
			printf("学生人数为:%d\\n\\n",count);
			break;
		case 6:
			//显示学生记录
			displayNode(head);
			break;
		case 7:
			//退出前清除链表中的所有结点
            clearLink(head);
			return 0;
		default:
			printf("输入不正确,应该输入0-7之间的数。\\n\\n");
			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<

以上是关于学生信息管理系统(链表&&C语言)的主要内容,如果未能解决你的问题,请参考以下文章

用c语言链表编写一个学生信息系统程序,要求输出学生的学号,姓名,性别,还有三门课比如语,数,外的成绩

c语言!!!程序设计:建立一个学生信息链表,包括学号,姓名,成绩.(实现添加,删除,查询,排序,平均)

C语言学生信息管理系统

C语言链表问题,作业编程。编好出现问题。高手看下。

用栈完成学生信息管理删除和撤销(C语言)

c语言编写学生信息管理系统