学生信息管理系统--链表

/*学生管理系统使用一级指针链表完成*/

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define NAME_SIZE 10
//#define MAX_SIZE 100
typedef int DATATYPE;
typedef struct stu{
	char name[NAME_SIZE];
	char sex[10];
	DATATYPE grade;
	DATATYPE id;
	struct stu *next;
}STD;//定义学生链表结构体

//创建一个列表
//student* creative(STD* Lstudent)//要返回一个结构类型的变量
void creative(STD *Lstudent)
{
	int i;
	int n;
	STD *r;
	r = Lstudent;//创建一个从头节点开始向下偏移的结构体指针
	printf("请输入学生个数\n");
	scanf("%d", &n);
	for(i = 0; i < n; i++)
	{
		STD *newStudent = (STD *)malloc(sizeof(STD));
		printf("请输入学生学号,姓名, 性别, 成绩\n");
		scanf("%d%s%s%d", &newStudent->id, newStudent->name, newStudent->sex, &newStudent->grade);
		r->next = newStudent;
		r = newStudent;
	}
	r->next = NULL;
	//return Lstudent;
}
//添加学生即链表添加
int add(STD *Lstudent)
{
	STD *r;
	char ch;
	int i = 1;
	r = Lstudent;
	
p2:		
	
	
	printf("请输入添加学生的学号\n");
	scanf("%d", &i);
	if(r->next == NULL)
	{
		printf("链表是空的\n");
		goto p2;
	}
	while(r->next && r->next->id != i)
	{
		r = r->next;
	}
	if(r->next == NULL || r->next->id != i)
	{	
		printf("该位置不存在,请重新输入\n");
		goto p2;
	}
	
	
	STD *newStudent = (STD*)malloc(sizeof(STD));//分配新节点
	printf("请输入学生学号,姓名,性别,成绩\n");
	scanf("%d%s%s%d", &newStudent->id, newStudent->name, newStudent->sex, &newStudent->grade);
	//printf("检测1");
	newStudent->next = r->next;
	//printf("检测2");
	r->next = newStudent;
	//printf("检测3");
	printf("添加成功\n");
	printf("是否继续添加(y/n)\n");
	scanf("%c", &ch);
	if (ch == 'y')
	{
		goto p2;
	}
	else if(ch == 'n')
	{
		return 0;
	}
}
	
void printSTD(STD *Lstudent)
{
	STD *r;
	r = Lstudent->next;
	while(r)
	{
		printf("学号 = %d, 姓名 = %s, 性别 = %s, 成绩 = %d\n", r->id, r->name, r->sex, r->grade);
		r = r->next;
	}
}

int DelSTD(STD *Lstudent)
{	
	int flag = 0, a;
	STD *r, *t;
	r = Lstudent;
	printf("当前信息\n");
	printSTD(Lstudent);
	printf("请输入要删除的学号\n");
	scanf("%d", &a);
	if (r->next == NULL)
	{
		printf("当前链表是空的,請添加\n");
		return 0;
	}
	while(r->next != NULL )
	{
		if(a == r->next->id)
		{
			flag = 1;
			break;
		}
		r = r->next;
	}
	if(flag = 0)
	{
		printf("该学号不存在\n");
	}
	t = r->next;
	r->next = r->next->next;
	free(t);
}

void modifySTD(STD* Lstudent)
{
	
}

void menu()
{
	printf("------------------------------------\n");
	printf("------------请输入操作---------------\n");
	printf("-----------1  创建学生表-------------\n");
	printf("-----------2  添加学生信息-----------\n");
	printf("-----------3  删除学生信息-----------\n");
	printf("-----------4  查询学生信息-----------\n");
	printf("-----------5  修改学生信息-----------\n");
	printf("-----------0  退出系统---------------\n");
}

int main()
{ 
	STD *Lstudent = (STD *)malloc(sizeof(STD));
	Lstudent->next = NULL;//创建头节点
	while(1)
	{
		int i;
		menu();
		scanf("%d", &i);
		switch(i)
		{
			case 1:creative(Lstudent);break;
			case 2:add(Lstudent);break;
			case 3:DelSTD(Lstudent);break;
			case 4:printSTD(Lstudent);break;
			case 5:modifySTD(Lstudent);break;
			case 0:return 0;
			default: printf("输入错误,请重新输入\n");break;
		}
	}
	
	
	return 0;
}


/*学生管理系统使用二级指针链表完成*/

/*学生管理系统使用链表完成*/

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define NAME_SIZE 10
//#define MAX_SIZE 100
typedef int DATATYPE;
typedef struct stu{
	DATATYPE id;
	char name[NAME_SIZE];
	char sex[10];
	DATATYPE grade;
	struct stu *next;
}std;//定义学生链表结构体

typedef struct stu	*student;

//创建一个列表
//student* creative(STD* Lstudent)//要返回一个结构类型的变量
void creative(student *L)
{
	int i;
	int n;
	student r,newStudent;
	*L  = (student)malloc(sizeof(std));
	(*L)->next = NULL;//创建头节点
	r = *L;//创建一个从头节点开始向下偏移的结构体指针
	printf("请输入学生个数\n");
	scanf("%d", &n);
	for(i = 0; i < n; i++)
	{
		newStudent = (student)malloc(sizeof(std));
		printf("请输入学生学号,姓名, 性别, 成绩\n");
		scanf("%d%s%s%d", &newStudent->id, newStudent->name, newStudent->sex, &newStudent->grade);
		r->next = newStudent;
		r = newStudent;
	}
	r->next = NULL;
	//return Lstudent;
}
//添加学生即链表添加
int add(student *L)
{
	student r,newStudent;
	char ch;
	int stuPosition = 1;
	int i = 1;
	r = *L;		
p1:	
	printf("请输入添加学生的位置\n");
	scanf("%d", &i);
	if(r->next==NULL)
	{
		printf("链表是空的\n");
		goto p1;
	}
	while(r && stuPosition < i)
	{
		r = r->next;
		stuPosition++;
	}
	if(!(r->next) || stuPosition > i)
	{	
		printf("该位置不存在,请重新输入\n");
		
	}
	goto p1;
	
	newStudent = (student)malloc(sizeof(std));//分配新节点
	printf("请输入学生学号,姓名,性别,成绩\n");
	scanf("%d%s%s%d", &newStudent->id, newStudent->name, newStudent->sex, &newStudent->grade);
	//printf("检测1");
	newStudent->next = r->next;
	printf("检测2");
	r->next = newStudent;
	printf("检测3");
	printf("添加成功\n");
	printf("是否继续添加(y/n)\n");
	scanf("%c", &ch);
	if (ch == 'y')
	{
		goto p1;
	}
	else if(ch == 'n')
	{
		return 0;
	}
}
	
void printSTD(student *L)
{
	student r;
	r = *L;
	while(r)
	{
		printf("学号 = %d, 姓名 = %s, 性别 = %s, 成绩 = %d\t", r->id, r->name, r->sex, r->grade);
		r = r->next;
	}
	printf("\n");
}

void menu()
{
	printf("------------------------------------\n");
	printf("------------请输入操作---------------\n");
	printf("-----------1  创建学生表-------------\n");
	printf("-----------2  添加学生信息-----------\n");
	printf("-----------3  删除学生信息-----------\n");
	printf("-----------4  查询学生信息-----------\n");
	printf("-----------5  修改学生信息-----------\n");
	printf("-----------0  退出系统---------------\n");
}

int main()
{ 
	student sd;
	while(1)
	{
		int i;
		menu();
		scanf("%d", &i);
		switch(i)
		{
			case 1:creative(&sd);break;
			case 2:add(&sd);break;
			case 3:printSTD(&sd);break;
			case 0:return 0;
			default: printf("输入错误,请重新输入\n");break;
		}
	}
	
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38821783/article/details/86537214