学生成绩管理系统

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#include <stdbool.h>

#define NO_LENGTH 20
#define NAME_LENGTH 11

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

typedef struct node
{
struct Student data; //数据域
struct node *next; //指针域
}Node,*Link; //Node为node类型的别名,Link为node类型的指针别名

//定义提示菜单
void myMenu()
{
printf("***菜 单\n");
printf(" 1.增加学生记录 2.删除学生记录 \n");
printf(" 3.查找学生记录 4.修改学生记录 \n");
printf(" 5.统计学生人数 6.显示学生记录 \n");
printf(" 7.退出系统 \n");
printf("******************************************\n");
}
void inputStudent(Link l){
printf(“请输入学生学号:”);
scanf("%s",l->data.studentNo);
printf(“请输入学生的姓名 “);
scanf(”%s”,l->data.studentName);
}
void inputStudentNo(char s[],char no[])
{
printf(“请输入要%s的学生学号:”,s);
scanf("%s",no);

}
void displayNode(Link head)
{
//填写代码,根据传入的链表head头指针,扫描链表显示所有节点的信息
}
/* 增加学生记录 */
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;

}
bool deleteNode(Link head){
Link p,q;//p,q两个节点一前一后
q=head;
p=head->next;
//输入要处理的学号
char no[NO_LENGTH];
inputStudentNo(“修改”,no);
if(head->nextNULL)
return false;
else
{
while(p!=NULL)
{if(no
p->data.studentNo)
{
q->next=p->next;
return true;
}

	          else
	          {
	          	q=p;
	          	p=p->next;
			  }
	   }

}
return false;
}
bool queryNode(Link head){
// 按照给定的学号查询学生记录,如果找到学号返回true,如果没找到学号返回false
Link q;
q=head;
//输入要处理的学号

 char no[NO_LENGTH];
inputStudentNo("修改",no);
while(q!=NULL)
    {
    	if(q->data.studentNo==no)
    	return true; 
    	else
    	 q=q->next;
   }
return false;

}

/*bool modifyNode(Link head){
// 按照给定的学号找到学生记录节点,如果修改成功返回true,如果没找到学号返回false

//输入要处理的学号
char no[NO_LENGTH];
inputStudentNo("修改",no);

return false;

}*/

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

void clearLink(Link head){
Link q,p;
p=head->next;
q=head->next;
while(q->next!=NULL)
{ p=q;
free§;
q=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请输入你的选择(1-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"); 			  
  /* 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");
		break;
  } 

}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱技术的小曹

你的鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值