数据结构(用链表实现学生管理系统)-洪庆乐

homework.h:

#ifndef __HOME_H__
#define __HOME_H__

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

typedef struct 
{
	int id;
	char name[20];
	float score;
}datatype;

typedef struct Node
{
	union
	{
		int len;
		datatype *data;
	};

	struct Node *next;
}student;

//菜单
void menu();
//创建链表
student *creat();
//判空
int empty(student *S);
//申请结点
student *nodeBuy(int id,char name[],float score);
//添加学生信息
int addStudent(student *S,int id,char name[],float score);
//遍历
void show(student *S);
//按姓名查找学生信息
student *selName(student *S,char name[]);
//删除指定学号学生信息
int delid(student *S,int id);
//通过姓名修改学生信息
int upd_name(student *S,char name[],int id_new,float score_new);
//按学号排序学生信息
void sort(student *S);
//头删
int delHead(student *S);
//销毁链表,退出系统
void destroy(student *S);
#endif

homework.c:

#include "homework.h"
//菜单
void menu()
{
	printf("----------------学生管理系统-------------------\n");
	printf("--------------1>增加学生信息---------------------\n");
	printf("--------------2>查看学生信息---------------------\n");
	printf("--------------3>按姓名查找学生信息---------------\n");
	printf("--------------4>删除指定学号学生信息-------------\n");
	printf("--------------5>修改学生信息---------------------\n");
	printf("--------------6>按学号排序学生信息---------------\n");
	printf("--------------0>退出系统-------------------------\n");
	printf("--------------------------------------------------\n");
}

//创建链表
student *creat()
{
	student *S = (student*)malloc(sizeof(student));
	if(NULL == S)
	{
		printf("系统启动失败(链表申请失败)\n");
		return NULL;
	}

	//初始化
	S->len = 0;
	S->next = NULL;

	printf("系统启动成功\n");
	return S;
}

//判空
int empty(student *S)
{
	if(NULL == S)
	{
		printf("所给链表不合法\n");
		return -1;
	}
	return S->next == NULL ? 1: 0; //1为空 0为非空
}

//申请结点
student *nodeBuy(int id,char name[],float score)
{
	student *p =(student*)malloc(sizeof(student));
	if(NULL == p)
	{
		printf("结点申请失败\n");
		return NULL;
	}

	//申请结点中的 data
	p->data = (datatype*)malloc(sizeof(datatype));

	//将数据录入
	p->data->id = id;
	strcpy(p->data->name,name);
	p->data->score = score;

	//初始化next指针
	p->next = NULL;

	return p;
}

//添加学生信息
int addStudent(student *S,int id,char name[],float score)
{
	if(NULL == S)
	{
		printf("所给链表不合法\n");
		return -1;
	}

	student *p = nodeBuy(id,name,score);

	p->next = S->next;
	S->next = p;

	S->len++;
	printf("添加学生信息成功\n");
	return 0;
}

//遍历
void show(student *S)
{
	if(NULL == S || empty(S))
	{
		printf("显示失败\n");
		return;
	}


	printf("\t学号\t姓名\t成绩\n");
	student *q = S->next;
	//遍历打印
	while(q != NULL)
	{
		printf("\t%d\t%s\t%.2f\n",q->data->id,q->data->name,q->data->score);
		q = q->next;
	}
	printf("显示完毕\n");
}

//删除指定id学生信息
int delid(student *S,int id)
{
	if(NULL == S || empty(S))
	{
		printf("删除失败\n");
		return -1;
	}

	student *q = S;

	//定位要删除的前一个位置
	while(q->next->data->id != id)
	{
		q = q->next;
	}

	//标记要删除的位置
	student *p = q->next;
	q->next = p->next;
	free(p->data);
	p->data = NULL;
	free(p);
	p = NULL;


	//表的变化
	S->len--;

	printf("删除成功\n");
}

//按姓名查找学生信息
student *selName(student *S,char name[])
{
	if(NULL == S || empty(S))
	{
		printf("查找失败\n");
		return NULL;
	}

	student *q = S->next;
	while(strcmp(q->data->name,name))
	{
		q = q->next;
		if(q == NULL)
		{
			printf("查无此人\n");
			return NULL;
		}
	}

	printf("学号\t姓名\t成绩\n");
	printf("%d\t%s\t%.2f\n",q->data->id,q->data->name,q->data->score);

	printf("查找成功\n");

	return q;
}

//按学号排序学生信息
void sort(student *S)
{
	int i,j;          //循环变量
	datatype *temp;         //交换变量
	student *p = S->next;
	student *q = S->next->next;

	for(i=1;i<S->len; i++)     //比较趟数
	{
	
		for(j=0;j<S->len-i; j++)  //元素  比较次数
		{
			if(p->data->id > q->data->id)       //大升小降
			{
				temp=q->data; q->data=p->data; p->data= temp;
			}
			q = q->next;
		}
		p = p->next;
		q = p->next;
	}
	printf("排序成功\n");

}
//头删
int delHead(student *S)
{
	//判断逻辑
	if(NULL == S || empty(S))
	{
		printf("删除失败\n");
		return -1;
	}

	//头删
	student *p = S->next;    //标记
	S->next = p->next;        //孤立
	free(S);                  //踢开
	p=NULL;

	//表的变化
	S->len--;
	printf("头删成功\n");

	return 0;
}


//销毁链表,退出系统
void destroy(student *S)
{
	if(NULL == S)
	{
		return;
	}

	//不断调用头删,将结点进行删除
	while(S->next != NULL)
	{
		delHead(S);
	}

	//将头结点释放
	free(S);
	S = NULL;

	printf("退出系统完成\n");
	return ;

}

//通过姓名修改学生信息
int upd_name(student *S,char name[],int id_new,float score_new)
{
	if(NULL == S || empty(S))
	{
		printf("修改失败\n");
		return -1;
	}

	student *p = selName(S,name);
	p->data->id = id_new;
	p->data->score = score_new;

	printf("修改成功\n");
	return 0;
}

main.c:

#include "homework.h"

int main(int argc, const char *argv[])
{
	student *S = creat();
	if(NULL == S)
	{
		return -1;
	}
	while(1)
	{
		int num;
		menu();
		printf("长度:%d\n",S->len);
		printf("选择功能:");
		scanf("%d",&num);

		switch(num)
		{
		case 1:
			{
				while(1)
				{
					int id;char name[20];float score;
					printf("请输入添加学生的学号:");
					scanf("%d",&id);
					printf("请输入添加学生的姓名:");
					scanf("%s",name);
					printf("请输入添加学生的成绩:");
					scanf("%f",&score);
					addStudent(S,id,name,score);
					printf("\n");
					int temp;
					printf("是否继续输入,继续1,不继续2:");
					scanf("%d",&temp);
					if(temp == 2)
					{
						break;
					}
				}
			}
		break;


		case 2:
			show(S);
		break;

		case 3:
			{
				char name[20];
				printf("请输入你要查询学生的姓名:");
				scanf("%s",name);
				printf("查询结果如下:\n");
				selName(S,name);
			}
		break;

		case 4:
			{
				while(1)
				{
					int id;
					printf("请输入要删除学生的学号:");
					scanf("%d",&id);
					delid(S,id);
					printf("\n");
					int temp;
					printf("是否继续输入,继续1,不继续2:");
					scanf("%d",&temp);
					if(temp == 2)
					{
						break;
					}
				}
			}
		break;
	
		case 5:
		{
			char name[20];int id_new;float score_new;
			printf("请输入你要修改学生的姓名:");
			scanf("%s",name);
			printf("请输入新的学号:");
			scanf("%d",&id_new);
			printf("请输入新的成绩\n");
			scanf("%f",&score_new);
			upd_name(S,name,id_new,score_new);
		}
		break;

		case 6:
			{
				sort(S);
			}
		break;

		case 0:
			destroy(S);
			S = NULL;
		return -1;	

		default:
			printf("输入错误请重新输入\n");
		break;
		}
	}
	return 0;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值