一、使用数组的方法
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct SUser
{
int nNumb;
char sName[20];
float fScore;
};
SUser g_user[2000];
void Print();
void Add();
void Delete();
void Modify();
void Find();
int CheckUser(SUser user);
void Save();
void Load();
void Sort(int nIndex);
int Judge(int nIndex, SUser* p);
int Menu();
int DisplayMenu();
void Save()
{
FILE* fp = fopen("data.li", "wb");
if (!fp)
{
puts("打开文件失败!");
return;
}
int i = 0;
while (g_user[i].nNumb)
{
if (g_user[i].nNumb != -1)
{
fwrite(&g_user[i], 1, sizeof(g_user[i]), fp);
}
++i;
}
fclose(fp);
}
void Load()
{
FILE* fp = fopen("data.li", "rb");
if (!fp)
return;
int i = 0;
while (sizeof(g_user[i]) == fread(&g_user[i], 1, sizeof(g_user[i]), fp))
++i;
fclose(fp);
}
void Print()
{
int i = 0,sum = 0;
puts("******************************");
printf("学号\t姓名\t成绩\n");
puts("------------------------------");
while (g_user[i].nNumb)
{
if (g_user[i].nNumb != -1)
{
printf("%d\t%s\t%.1f\n", g_user[i].nNumb, g_user[i].sName, g_user[i].fScore);
++sum;
}
++i;
}
puts("------------------------------");
printf("\t共有%d条学生信息\n", sum);
puts("******************************");
}
void Add()
{
SUser user;
int i = 0;
while (g_user[i].nNumb&&g_user[i].nNumb!=-1)
++i;
printf("请输入学号、姓名以及成绩[空格隔开]:");
scanf_s("%d%s%f", &user.nNumb, user.sName, sizeof(user.sName), &user.fScore);
if (!CheckUser(user))
{
g_user[i] = user;
Save();
printf("添加成功!\n");
}
else
printf("添加失败!次学号已存在!\n");
}
int CheckUser(SUser user)
{
int i = 0;
int sum = 0;
while (g_user[i].nNumb)
{
if (g_user[i].nNumb == user.nNumb)
++sum;
++i;
}
return sum;
}
void Delete()
{
printf("请输入要删除的学号:");
int i = 0,sno = 0;
scanf_s("%d", &sno);
while (g_user[i].nNumb)
{
if (g_user[i].nNumb == sno)
{
g_user[i].nNumb = -1;
Save();
printf("删除成功!\n");
return;
}
++i;
}
printf("没有找到指定学号!\n");
}
void Find()
{
printf("请输入要查找的学号: ");
int sno = 0;
scanf_s("%d", &sno);
puts("******************************");
printf("学号\t姓名\t成绩\n");
puts("------------------------------");
int i = 0;
while (g_user[i].nNumb)
{
if (g_user[i].nNumb == sno)
{
printf("%d\t%s\t%.1f\n", g_user[i].nNumb, g_user[i].sName, g_user[i].fScore);
puts("------------------------------");
printf("\t查询到1条学生信息\n");
puts("******************************");
return;
}
++i;
}
printf("没有找到!\n");
puts("------------------------------");
printf("\t查询到0条学生信息\n");
puts("******************************");
}
void Modify()
{
printf("请输入要修改的学号: ");
int sno = 0;
scanf_s("%d", &sno);
int i = 0;
while (g_user[i].nNumb)
{
if (g_user[i].nNumb == sno)
{
SUser user;
printf("查询到信息:\n");
printf("学号:%d\t姓名:%-8s成绩:%.1f\n", g_user[i].nNumb, g_user[i].sName, g_user[i].fScore);
printf("请输入修改的学号、姓名以及成绩[空格隔开]:");
scanf_s("%d%s%f", &user.nNumb, user.sName, sizeof(g_user[i].sName), &user.fScore);
if (user.nNumb!=g_user[i].nNumb && CheckUser(user)>0)
{
printf("修改失败!此学号已存在!\n");
return;
}
g_user[i] = user;
Save();
printf("修改成功!\n");
return;
}
++i;
}
printf("没有找到!\n");
}
int Judge(int nIndex, SUser* p)
{
if (nIndex == 1)
return p[0].nNumb > p[1].nNumb;
if (nIndex == 2)
return strcmp(p[0].sName, p[1].sName) > 0;
if(nIndex==3)
return p[0].fMath < p[1].fScore;
return 0;
}
void Sort(int nIndex)
{
int num = 0;
while (g_user[num].nNumb)
{
++num;
}
for (int i = 0; i<num - 1; ++i)
for (int j = 0; j < num - i - 1; ++j)
{
if (Judge(nIndex, &g_user[j]))
{
SUser user = g_user[j];
g_user[j] = g_user[j + 1];
g_user[j + 1] = user;
}
}
}
int DisplayMenu()
{
puts("1. 按学号排序");
puts("2. 按姓名排序");
puts("3. 按成绩排序");
puts("0. 返回主菜单o");
printf("请选择:");
int i = 0;
scanf_s("%d", &i);
switch (i)
{
case 1:
case 2:
case 3:
Sort(i);
Print();
break;
}
return i;
}
int Menu()
{
puts("");
puts("1. 浏览所有信息");
puts("2. 添加信息");
puts("3. 删除信息");
puts("4. 修改信息");
puts("5. 查找信息");
puts("0. 退出");
printf("请选择:");
int i = 0;
scanf_s("%d", &i);
switch (i)
{
case 1:
while (DisplayMenu())
;
break;
case 2:
Add();
break;
case 3:
Delete();
break;
case 4:
Modify();
break;
case 5:
Find();
break;
}
return i;
}
int main()
{
Load();
while (Menu())
;
return 0;
}
二、使用链表的方法
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct SUser
{
int nNumb;
char sName[20];
float fScore;
};
typedef SUser DATA;
struct SNode
{
DATA data;
SNode* pNext;
};
SNode* g_pHead = NULL;
int AddTail(DATA data);
int AddHead(DATA data);
int CheckUser(int);
void Save()
{
FILE* fp = fopen("data.info", "wb");
if (!fp)
{
puts("读写文件失败!");
return;
}
SNode* p = g_pHead;
while (p)
{
fwrite(&p->data, 1, sizeof(p->data), fp);
p = p->pNext;
}
fclose(fp);
}
void Load()
{
FILE* fp = fopen("data.info", "rb");
if (!fp)
return;
SNode* p = g_pHead;
DATA data;
int n = 0;
while ((n=fread(&data,1,sizeof(DATA),fp))>0)
{
AddTail(data);
}
fclose(fp);
}
void Print()
{
puts("******************************");
printf("学号\t姓名\t成绩\n");
puts("------------------------------");
SNode* p = g_pHead;
int sum = 0;
while (p)
{
printf("%d\t%s\t%0.1f\n", p->data.nNumb,p->data.sName,p->data.fScore);
p = p->pNext;
++sum;
}
puts("------------------------------");
printf("\t共有%d条学生信息\n", sum);
puts("******************************");
}
int Input(int nIndex)
{
DATA data;
int flag = 0;
do
{
printf("请输入学号:");
scanf_s("%d", &data.nNumb);
if (!data.nNumb)
return 0;
if (flag = CheckUser(data.nNumb))
puts("此学号以及存在!");
} while (flag);
printf("请输入姓名:");
scanf_s("%s", data.sName, sizeof(data.sName));
printf("请输入成绩:");
scanf_s("%f", &data.fScore);
if (nIndex == 1)
{
return AddHead(data);
}
else
{
return AddTail(data);
}
}
int AddHead(DATA data)
{
SNode* p = (SNode*)malloc(sizeof(SNode));
p->data = data;
p->pNext = g_pHead;
g_pHead = p;
return 1;
}
int AddTail(DATA data)
{
SNode* p = (SNode*)malloc(sizeof(SNode));
p->data = data;
p->pNext = NULL;
if (!g_pHead)
{
g_pHead = p;
return 1;
}
SNode* q = g_pHead;
while (q->pNext)
q = q->pNext;
q->pNext = p;
return 1;
}
int Delete()
{
printf("请输入要删除的学号:");
int i = 0, nNumb = 0;
scanf_s("%d", &nNumb);
if (!g_pHead)
return 0;
if (g_pHead->data.nNumb == nNumb)
{
SNode* q = g_pHead;
g_pHead = g_pHead->pNext;
free(q);
Save();
return 1;
}
SNode* pHead = g_pHead;
SNode* p = g_pHead->pNext;
while (p)
{
if (p->data.nNumb == nNumb)
break;
pHead = p;
p = p->pNext;
}
if (p)
{
pHead->pNext = p->pNext;
free(p);
Save();
return 1;
}
printf("没有找到指定学号!\n");
return 0;
}
void Modify()
{
printf("请输入要修改的学号: ");
int nNumb = 0;
scanf_s("%d", &nNumb);
SNode* p = g_pHead;
while (p)
{
if (nNumb == p->data.nNumb)
{
DATA data;
printf("查询到信息:\n");
printf("学号:%d\t姓名:%-8s成绩:%.1f\n", p->data.nNumb, p->data.sName, p->data.fScore);
printf("请输入修改的学号、姓名以及成绩[空格隔开]:");
scanf_s("%d%s%f", &data.nNumb, data.sName, sizeof(data.sName), &data.fScore);
if (data.nNumb != p->data.nNumb && CheckUser(data.nNumb) > 0)
{
puts("此学号已存在!");
return;
}
p->data = data;
Save();
puts("修改成功!");
return;
}
p = p->pNext;
}
puts("没有找到次学号!");
}
void Find()
{
printf("请输入要查找的学号: ");
int nNumb = 0;
scanf_s("%d", &nNumb);
puts("******************************");
printf("学号\t姓名\t成绩\n");
puts("------------------------------");
SNode* p = g_pHead;
while (p)
{
if (p->data.nNumb == nNumb)
{
printf("%d\t%s\t%.1f\n", p->data.nNumb, p->data.sName, p->data.fScore);
puts("------------------------------");
printf("\t查询到1条学生信息\n");
puts("******************************");
return;
}
p = p->pNext;
}
printf("没有找到!\n");
puts("------------------------------");
printf("\t查询到0条学生信息\n");
puts("******************************");
}
int AddMenu()
{
puts("1. 头部添加");
puts("2. 尾部添加");
puts("0. 返回主菜单");
printf("请选择:");
int i = 0;
scanf_s("%d", &i);
switch (i)
{
case 1:
case 2:
{
if (Input(i))
{
Save();
puts("添加成功!");
}
break;
}
}
return i;
}
int Judge(SNode* p, SNode* pMin, int nIndex)
{
switch (nIndex)
{
case 1:
return p->data.nNumb < pMin->data.nNumb;
case 2:
return strcmp(p->data.sName, pMin->data.sName) < 0;
case 3:
return p->data.fScore > pMin->data.fScore;
}
}
void Sort(int nIndex)
{
SNode* pHead = g_pHead;
while (pHead)
{
SNode* pMin = pHead;
SNode* p = pHead->pNext;
while (p)
{
if (Judge(p,pMin, nIndex))
pMin = p;
p = p->pNext;
}
if (pMin != pHead)
{
DATA data = pHead->data;
pHead->data = pMin->data;
pMin->data = data;
}
pHead = pHead->pNext;
}
}
int PrintMenu()
{
puts("1. 按学号排序");
puts("2. 按姓名排序");
puts("3. 按成绩排序");
puts("0. 返回主菜单");
printf("请选择:");
int i = 0;
scanf_s("%d", &i);
switch (i)
{
case 1:
case 2:
case 3:
Sort(i);
Print();
break;
}
return i;
}
int Menu()
{
puts("");
puts("1. 浏览所有信息");
puts("2. 添加信息");
puts("3. 删除信息");
puts("4. 修改信息");
puts("5. 查找信息");
puts("0. 退出");
printf("请选择:");
int i = 0;
scanf_s("%d", &i);
switch (i)
{
case 1:
while (PrintMenu())
;
break;
case 2:
while (AddMenu())
;
break;
case 3:
{
int res = Delete();
if (res)
puts("删除成功!");
break;
}
case 4:
{
Modify();
break;
}
case 5:
{
Find();
break;
}
}
return i;
}
int CheckUser(int nNumb)
{
SNode* p = g_pHead;
int sum = 0;
while (p)
{
if (p->data.nNumb == nNumb)
++sum;
p = p->pNext;
}
return sum;
}
int main()
{
Load();
while (Menu())
;
return 0;
}