C language practical algorithm series of student management system_single-linked list operation_selection sort

Singly linked list implementation

#include <stdio.h>
#include <malloc.h>

typedef int DATA;

struct SNode
{
    
    
	DATA data;
	SNode* pNext;
};
SNode* g_pHead = NULL;

void AddHead(DATA data)
{
    
    
	SNode* p = (SNode*)malloc(sizeof(SNode));
	p->data = data;
	p->pNext = g_pHead;
	g_pHead = p;
}

void AddTail(DATA data)
{
    
    
	SNode* pNew = (SNode*)malloc(sizeof(SNode));
	pNew->data = data;
	pNew->pNext = NULL;
	if (!g_pHead)
	{
    
    
		g_pHead = pNew;
		return;
	}
	SNode* p = g_pHead;
	while (p->pNext)
		p = p->pNext;
	p -> pNext = pNew;
}

void Print()
{
    
    
	SNode* p = g_pHead;
	while (p)
	{
    
    
		printf("%d ", p->data);
		p = p->pNext;
	}
}

int main()
{
    
    
	AddHead(3);
	AddHead(2);
	AddHead(1);

	return 0;
}

Student Management System_Operation in one-way linked list

  • Only the 按学号排序SortByNumbfunction is implemented , and the implementation is similar to sorting by name and mathematics score. You can refer to the previous article without repeating it.
  • Operation within a singly linked list means that the internal data of the linked list is directly sorted when sorting, which will change the content of the linked list.
#define _CRT_SECURE_NO_WARNINGS

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

typedef struct SUser
{
    
    
	int nNumb;
	char sName[20];
	float fMath;
}DATA;

struct SNode
{
    
    
	DATA data;
	SNode* pNext;
};

SNode* g_pHead = NULL;

void AddTail(DATA data)
{
    
    
	SNode* pNew = (SNode*)malloc(sizeof(SNode));
	pNew->data = data;
	pNew->pNext = NULL;
	if (!g_pHead)
	{
    
    
		g_pHead = pNew;
		return;
	}
	SNode* p = g_pHead;
	while (p->pNext)
		p = p->pNext;
	p->pNext = pNew;
}

void AddHead(DATA data)
{
    
    
	SNode* p = (SNode*)malloc(sizeof(SNode));
	p->data = data;
	p->pNext = g_pHead;
	g_pHead = p;
}

void Load()
{
    
    
	DATA data;
	FILE* pf = fopen("stud.lv", "r");
	if (!pf)
	{
    
    
		puts("加载信息时失败!");
		return;
	}
	while (fread(&data, 1, sizeof(DATA), pf) == sizeof(DATA))
	{
    
    
		AddTail(data);
	}
	fclose(pf);
}

void Save()
{
    
    
	SNode* p = g_pHead;
	FILE* pf = fopen("stud.lv", "w");
	if (!pf)
	{
    
    
		puts("保存文件时失败!");
		return;
	}
	while (p)
	{
    
    
		fwrite(p, 1, sizeof(p->data), pf);
		//fwrite(&p->data, 1, sizeof(p->data), pf);
		p = p->pNext;
	}
	fclose(pf);
}

void Print()
{
    
    
	system("cls");
	puts("学号\t姓名\t成绩");
	int i = 0;
	SNode* p = g_pHead;
	while (p)
	{
    
    
		printf("%d\t%s\t%0.1f\n", p->data.nNumb,p->data.sName,p->data.fMath);
		p = p->pNext;
		++i;
	}
	printf("\t总共有 %d 条记录\n", i);
	system("pause");
}

void Input(int nDir)
{
    
    
	int nNumb;
	printf("请输入学号:");
	scanf_s("%d", &nNumb);
	DATA data;
	data.nNumb = nNumb;
	printf("请输入姓名:");
	scanf_s("%s", data.sName, sizeof(data.sName));
	printf("请输入成绩:");
	scanf_s("%f", &data.fMath);
	if (1 == nDir)
		AddHead(data);
	else
		AddTail(data);
	Save();
	Print();
}

int AddMenu()
{
    
    
	puts("1.向头部插入");
	puts("2.向尾部插入");
	puts("0.返回主菜单");
	int i = 0;
	scanf_s("%d", &i);
	switch (i)
	{
    
    
	case 1:
	case 2:
		Input(i);
		break;
	}
	return i;
}

void SortByNumb()
{
    
    
	SNode* p = g_pHead;
	if (!p)
		return;
	while (p->pNext)
	{
    
    
		SNode* q = p->pNext;
		SNode* m = p;
		while (q)
		{
    
    
			if (q->data.nNumb < m->data.nNumb)
				m = q;
			q = q->pNext;
		}
		if (m != p)
		{
    
    
			DATA t = p->data;
			p->data = m->data;
			m->data = t;
		}
		p = p->pNext;
	}
}

int SortMenu()
{
    
    
	system("cls");
	puts("1.按学号排序");
	puts("2.按姓名排序");
	puts("3.按成绩排序");
	puts("0.返回主菜单");
	int i = 0;
	scanf_s("%d", &i);
	switch (i)
	{
    
    
	case 1:
		SortByNumb();
		break;
	case 2:
		break;
	case 3:
		break;
	default:
		return i;
	}
	Print();
	return i;
}

int Menu()
{
    
    
	int i = 0;
	system("cls");
	puts("1.浏览所有信息");
	puts("2.添加信息");
	puts("3.删除信息");
	puts("4.修改信息");
	puts("5.查找信息");
	puts("6.颜色设置");
	puts("0.退出");
	printf("请选择:");
	scanf_s("%d", &i);
	switch (i)
	{
    
    
	case 0:
		break;
	case 1:
		while (SortMenu())
			;
		break;
	case 2:
		while (AddMenu())
			;
		break;
	}
	return i;
}

int main()
{
    
    
	Load();
	while (Menu())
		;

	return 0;
}

Guess you like

Origin blog.csdn.net/wlwdecs_dn/article/details/111184928