Student management system c language linked list writing source code

//问题汇总
//第一 注意调用结构体函数的情况以及作用是建立头表和结点时才调用,与功能函数void类区分开
//第二 出现不允许指针指向不完整的类类型,两种情况,第一include未引用,第二字符输入错误,即结构体的字符输入错误
//第三一个完整的单链表创建的实际思路
//第四 出现中文乱码典型的四种原因,数组溢出,字符串未初始化,输入值时选择的输入方式存在问题,内存未释放
//注意 输入中最好不要出现\n的状况特点
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>

#pragma warning(disable:4996)
#define NEW   (struct student *)malloc(sizeof(student))
#define LEN sizeof(struct student)
struct student
{
    
    
	char num[100];
	char name[100];
	int cgrade;
	int egrade;
	int mgrade;
	int total;
	struct student *next;
}xueshen[100],hz[100];
struct student* list;

int STUNUM=0;
int n;
//------------------------------函数菜单选择---------------------------------------------++
void menu()
{
    
     
	printf("*******************************************************\n");
	printf("********************学生管理系统***********************\n");
	printf("*******************************************************\n");
	printf("                   MAIN MENU                           \n");
	printf("                   1--显示学生信息                     \n");
	printf("                   2--增加学生信息                     \n");
	printf("                   3--删除学生信息                     \n");
	printf("                   4--修改学生信息                     \n");
	printf("                   5--查找学生信息                     \n");
	printf("                   6--退出程序                         \n");
	printf("*******************************************************\n");
}
//------------------------------函数功能实现模块------------------------------------------++
struct student* creat()//注意想要引用结构体的数据时,必须代结构体中的思路状况特点
{
    
    
	 struct student * head;
	 head = NEW;
	 head->next = NULL;
	 return (head);
}
struct student* node()//即给予的是 创建结点时调用的
{
    
    
	struct student *p1;
	p1 = NEW;//注意建立的结点也需要开辟空间的状况特点
	scanf("%s%s%d%d%d%d", p1->num, p1->name, &p1->cgrade, &p1->egrade,&p1->mgrade, &p1->total);
	p1->next = NULL;
	return (p1);
}
//-----------------------------------------保存与读取功能-------------------
//保存链表的话就需要用结构体的形式一个一个代存,即本质差不多,只是一个利用的是循环的思路,一个利用的是指针域移动的思路
void save(struct student *head)//即利用结构体的头指针,即表调用
{
    
    
	struct student *p;
	FILE *fp;
	fp=fopen("kk.dat","wb+");
	p = head;
	while (p != NULL)
	{
    
    
		fwrite(p, LEN, 1, fp);
		p = p->next;
	}

	fclose(fp);
}
//注意指针读取时需要开辟新的空间且需要将值赋予给链表的参数中否则无法读取出,否则就会内存区错误
//即链表写法的读取具有不同且如果是爆不能转换类错误时,需要注意名字是否错误的状况
//注意返回值需要赋值予链表的状况特点
struct student *duq(void)
{
    
    

	struct student *p1;
	struct student *p2 = NEW;
	struct student *head = NULL;
	FILE *fp;
	fp = fopen("kk.dat", "rb+");


	while (!feof(fp)) 
	{
    
    
		if ((p1 = NEW) == NULL)
		{
    
    
			printf("内存申请出错\n");
			fclose(fp);
			exit(0);
		}
		if (fread(p1, LEN, 1, fp) != 1)
		{
    
    
			free(p1);
			break;
		}
		if (head == NULL)
			head = p2=p1;
		else
		{
    
    
			p2->next = p1;
			p2 = p1;
		}
	}
	fclose(fp);
	return (head);
}

//------------------------------函数功能显示模块------------------------------------------++
//显示功能函数
void read(struct student *head)//即可直接代head头文件读取的方式代
{
    
    
	struct student *p2 = head->next;
	while(p2 != NULL)
	{
    
    
			printf("%s %s %d %d %d %d\n", p2->num, p2->name, p2->cgrade, p2->egrade, p2->mgrade, p2->total);
			p2 = p2->next;
	}
		printf("\n");

}
//增加功能函数
void add(struct student *head)
{
    
    
	
	char name[10];
	int j=0;
	printf("请输入需要增加的用户的名字:\n");
	scanf("%s", name);
	struct student *xz = head;
	xz = head->next;
	if (xz == NULL)//判断头表是不是空的状况特点
	{
    
    
		j = 0;
	}
	else
	{
    
    
		while (strcmp(name, xz->name) != 0)//即查找值的状况特点
		{
    
    
			xz = xz->next;
			if (xz == NULL)
			{
    
    
				j = 0;
				break;
			}
		}
		if (xz != NULL)
		{
    
    
			++j;
		}

	}
	if (j == 0)
	{
    
    
		printf("该用户可添加,请输入用户数据:\n");
			struct student* xnode = node();
			xnode->next = head->next;
			head->next = xnode;
			printf("添加成功\n");
	}
	else
	{
    
    
		printf("添加失败,该用户已存在\n");
	}
	save(list);
}
//删除功能函数
void del(struct student *head)
{
    
    
	char name[10];
	printf("请输入需要删除的用户的名字:\n");
	scanf("%s", name);
	struct student *xz = head;
	struct student *xzd = head;
	xz = head->next;
	if (xz == NULL)//判断头表是不是空的状况特点
	{
    
    
		printf("不存在该用户\n");
	}
	else
	{
    
    
		while (strcmp(name, xz->name) != 0)//即查找值的状况特点
		{
    
    
			xzd = xz;
			xz = xz->next;
			if (xz == NULL)
			{
    
    
				printf("不存在该用户\n");
				break;
			}
		}
		if (xz != NULL)
		{
    
    
			xzd->next = xz->next;
			free(xz);
			printf("删除成功\n");
		}

	}
}
//更改功能函数
void cha(struct student *head)
{
    
    
	char name[10];
	printf("请输入需要修改用户的名字:\n");
	scanf("%s", name);
	struct student *xz = head;
	xz = head->next;
	if (xz == NULL)//判断头表是不是空的状况特点
	{
    
    
		printf("不存在该用户\n");
	}
	else
	{
    
    
		while (strcmp(name, xz->name) != 0)//即查找值的状况特点
		{
    
    
			xz = xz->next;
			if (xz == NULL)
			{
    
    
				printf("不存在该用户\n");
				break;
			}
			
		}
		if (xz != NULL)
		{
    
    
			printf("查找到用户的信息为:\n");
			printf("%s %s %d %d %d %d\n", xz->num, xz->name, xz->cgrade, xz->egrade, xz->mgrade, xz->total);
			printf("请输入更改后的用户信息数据:\n");
			scanf("%s%s%d%d%d%d", xz->num, xz->name, &xz->cgrade, &xz->egrade, &xz->mgrade, &xz->total);
		}
	}
}
//查找功能函数
void see(struct student *head)
{
    
    
	char name[10];
	printf("请输入需要查找用户的名字:\n");
	scanf("%s", name);
	struct student *xz = head;
	xz = head->next;
	if (xz == NULL)//判断头表是不是空的状况特点
	{
    
    
		printf("不存在该用户\n");
	}
	else
	{
    
    
		while (strcmp(name, xz->name) != 0)//即查找值的状况特点
		{
    
    
			xz = xz->next;
			if (xz == NULL)
			{
    
    
				printf("不存在该用户\n");
				break;
			}
		
		}
		if (xz != NULL)
		{
    
    
			printf("查找到的信息为:\n");
		    printf("%s %s %d %d %d %d\n", xz->num, xz->name, xz->cgrade, xz->egrade, xz->mgrade, xz->total);
		}
	}
}

void xuanz()
{
    
    
	
	int j = 0, x=1;
    menu();
	while (n != 5)
	{
    
    
	printf("请输入数字选择功能:\n");
	scanf_s("%d", &n);
	switch (n)//选择功能
	{
    
    
	    case 1:   list=duq(); read(list);                                                                             break;
		case 2:   list=duq();  add(list);                                                                             break;
		case 3:   list=duq(); del(list); save(list);                                                                  break;
		case 4:   list=duq(); cha(list); save(list);                                                                  break;
		case 5:   list=duq(); see(list);                                                                              break;
		case 6:   exit(0);                                                                                            break;
	    default: printf("输出错误,请重新输入:\n");                                                                    break;
		
	}
		
	}
}

//-----------------------------------主函数模块--------------------------------------------++

int main()
{
    
    
	list = NEW;
	list = creat();
	xuanz();
	system("pause");
	return 0;
}


Guess you like

Origin blog.csdn.net/qq_33942040/article/details/108428913