运行条件:
需要建立一个名字为1文件在D盘中,fp=fopen(“D:\1.txt”,“w+”);
在控制台输入的信息会自动记入到该文件中,缺点是无法对文件本身进行操作改变信息,不稳定,优点是使用链表结构,可以存储数量未知的学生信息 ,退出时会释放空间。
总体概况:
1)使用结构体建立学生信息体制
2)实现五大基本功能
3)采用文件存储学生信息
4)系统采用菜单的方式工作
功能概述:
1)查询学生信息 按学号或姓名查询
2)添加学生信息
3)修改学生信息
4)删除学生信息
5)对学生按照学号排序并输出其信息
建立文件并记录信息
void BuildFile(node* head);/*建立文件基本信息*/
输入n个学生信息
node* Input(int n);/*输入n个学生信息*/
添加学生信息
node* Add(node* p);/*添加学生信息*/
寻找学生信息
node* Search(node* p);/*寻找学生信息*/
修改学生信息
node* Change(node* p);/*修改学生信息*/
删除学生信息
node* Delete(node* p);/*删除学生信息*/
根据学号排序
node* Order(node* p);/*根据学生学号排序*/
关闭,清空,退出
void Close(node* p);/*关闭*/
显示菜单
void Menu();/*显示菜单*/
显示其他
void Show()/*显示其他*/
以下是源代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 30
typedef struct Student node; //利用链表结构存储学生信息
struct Student
{/*数据域*/
int num;//学号
char name[20];//姓名
char sex[10];//性别
int age;//年龄
/*指针域*/
node* next;//指向下一个学生
};
FILE *fp;
/*建立文件基本信息*/
void BuildFile(node* head)
{
node* p = head;
fp=fopen("D:\\1.txt","w+");
if(!fp)
{
printf("文 件 打 开 失 败!");
exit(0);
}
fprintf(fp,"%s\n","=====学生个人信息=====");
while(p){
fprintf(fp,"%s\n","----------------------------");
fprintf(fp,"%s%15d\n%s%15s\n%s%15s\n%s%15d\n","学号:",p->num,"姓名:",p->name,"性别:",p->sex,"年龄:",p->age);
p = p->next;
}
fclose(fp);
printf("\n文 件 成 功 建 立 !!!\n");
}
/*输入n个学生信息*/
node* Input(int n)
{
node* p = NULL;
node* head =NULL;
int i = 1;
printf("<请在下面输入学生基本信息>\n");
while(i <= n)
{
printf("------------------------------------\n");
if(!head){
head = p =(node *)malloc(sizeof(struct Student));
/*输入学生基本信息*/
printf("输入学生学号:\t");
scanf("%d",&p->num);
printf("输入学生姓名:\t");
scanf("%s", p->name);
printf("输入学生性别:\t");
scanf("%s", p->sex);
printf("输入学生年龄:\t");
scanf("%d", &p->age);
p->next = NULL;
}else{
p->next = (node*)malloc(sizeof(struct Student));
/*输入学生基本信息*/
printf("输入学生学号:\t");
scanf("%d",&p->next->num);
printf("输入学生姓名:\t");
scanf("%s", p->next->name);
printf("输入学生性别:\t");
scanf("%s", p->next->sex);
printf("输入学生年龄:\t");
scanf("%d", &p->next->age);
p->next->next = NULL;
p = p->next;
}
++i;
}
BuildFile(head);
return head;
}
/*添加学生信息*/
node* Add(node* p)
{
system("cls");
int n;
node* head = p;
if(!p){
return NULL;
}
printf("请输入添加几个学生的信息:\t");
scanf("%d",&n);
while(n>0){
if(p->next==NULL){
printf("\n");
p->next = (node*)malloc(sizeof(struct Student));
/*输入学生基本信息*/
printf("输入学生学号:\t");
scanf("%d",&p->next->num);
printf("输入学生姓名:\t");
scanf("%s", p->next->name);
printf("输入学生性别:\t");
scanf("%s", p->next->sex);
printf("输入学生年龄:\t");
scanf("%d", &p->next->age);
p->next->next = NULL;
n--;//次数减一
}
p = p->next;
}
BuildFile(head);
return head;
}
/*寻找学生信息*/
node* Search(node* p)
{
if(!p){
return NULL;
}
char n[N];//一个汉字占俩个字节
printf("\n请输入查询的方式(选择输入:学号或姓名):\t");
scanf("%s", n);
int k;//n下岗了
node* p1 = p;//老工具人1号
node* p2 = p; //老工具人2号
if(strcmp(n,"学号")==0){
printf("\n请输入您需要查找的学生学号:\t");
scanf("%d", &k);
while(p1){
if(p1->num==k){
printf("\n------------------------------------\n");
printf("学生学号:%5d\n",p1->num);
printf("学生姓名:%5s\n",p1->name);
printf("学生性别:%5s\n",p1->sex);
printf("学生年龄:%5d\n",p1->age);
printf("\n");
return p;
}
p1 = p1->next;
}
}
char bb[N];
if(strcmp(n,"姓名")==0){
printf("\n请输入您需要查找的学生姓名:\t");
scanf("%s", bb);
while(p2){
if(strcmp(p2->name, bb)==0){
printf("\n------------------------------------\n");
printf("学生学号:%5d\n",p2->num);
printf("学生姓名:%5s\n",p2->name);
printf("学生性别:%5s\n",p2->sex);
printf("学生年龄:%5d\n",p2->age);
printf("\n");
return p;
}
p2 = p2->next;
}
}
}
/*修改学生信息*/
node* Change(node* p)
{
node* p1 = (node*)malloc(sizeof(node));//头结点
p1->next = p;
if(!p){
return NULL;
}
int n;
node *p2, *p3;//p2尾随p,而p3在需要改的结点处保存p
p2 = p1;
printf("\n请输入您需要修改学生的信息的学号:\t");
scanf("%d", &n);
while(p){
if(p->num==n){
node* p4=(node*)malloc(sizeof(node));
p3 = p;
p4->next = p->next;
p = p4;
p2->next = p;
p3->next = NULL;
free(p3);
printf("\n------------------------------------\n");
/*输入修改的学生信息*/
printf("输入修改后的学生学号:\t");
scanf("%d",&p->num);
printf("输入修改后的学生姓名:\t");
scanf("%s", p->name);
printf("输入修改后的学生性别:\t");
scanf("%s", p->sex);
printf("输入修改后的学生年龄:\t");
scanf("%d", &p->age);
printf("\n");
node* head;
head = p1->next;//保存
free(p1);
BuildFile(head);
return head;
}
p = p->next;
p2 = p2->next;
}
}
/*删除学生信息*/
node* Delete(node* p)
{
node* head = p;
if(!p||p->next==NULL){
return NULL;
}
int n;
printf("\n请输入您要删除的学生信息的学号:\t");
scanf("%d", &n);
while(1){
if(p->num==n){//头节点数据与其相等
head = p->next;
free(p);
BuildFile(head);
return head;
}
else if(p->next->num==n){//其他结点数据与其相等
node* h = p->next;//保存需要删除的节点位置
p->next = p->next->next;
h->next = NULL;
free(h);
BuildFile(head);
return head;
}
if(p->next->next==NULL){//都没找到
return NULL;
}
p = p->next;
}
}
/*根据学生学号排序*/
node* Order(node* p)
{
system("cls");
node* head;
node* p1 = p;//计算长度
node* p2 = (node*)malloc(sizeof(node));//空结点
p2->next = p;
head = p2;//保存空结点
if(!p){
return NULL;
}
/*计算出元素个数*/
int count = 0;
while(p1){
count++;
p1 = p1->next;
}
/*选择排序法*/
for(int i=1; i<count; i++){
for(int j=1; j<count+1-i; j++){
if(p->num > p->next->num){
p2->next = p->next;
p->next = p2->next->next;
p2->next->next = p;
p2 = p2->next;
}
else{
p2 = p2->next;
p = p->next;
}
}
p2 = head;
p = head->next;
}
/*输出学生全部数据*/
node* p3 = head->next;//用来输出学生数据
while(p3){
printf("------------------------------------\n");
printf("学生学号:%5d\n",p3->num);
printf("学生姓名:%5s\n",p3->name);
printf("学生性别:%5s\n",p3->sex);
printf("学生年龄:%5d\n",p3->age);
p3 = p3->next;
}
node* p4 = head->next;
free(head);
BuildFile(p4);
return p4;
}
/*关闭*/
void Close(node* p)
{
node* head;
while(p){ //释放全部空间
head = p;
p = p->next;
free(head);
}
exit(0);
}
/*显示菜单*/
void Menu()
{
printf("================================主菜单================================\n");
printf("1,添加学生信息 \n");
printf("2,查询学生信息 (按学号或姓名查询) \n");
printf("3,修改学生信息\n");
printf("4,删除学生信息\n");
printf("5,对学生按照学号排序并输出其信息 \n");
printf("======================================================================\n");
}
/*显示其他*/
void Show()
{
/*首先进行输入学生信息操作*/
int n;
printf("请输入您需要输入几个学生的信息:\t");
scanf("%d",&n);
node *p = Input(n);
printf("\n");
/*显示主菜单*/
while (1)
{
getchar();//吸收换行符
Menu();
printf("本程序实现五大功能,您可以选择哪个功能(1~5)或者按空格+Enter退出:\t");
char ch = getchar();
switch (ch)
{
case '1':
p = Add(p);break;
case '2':
p = Search(p);break;
case '3':
p = Change(p);break;
case '4':
p = Delete(p);break;
case '5':
p = Order(p);break;
case ' ':
Close(p);
default:
printf("\n数据错误!!!\n");
break;
}
printf("\n");
}
}
/*吃干饭的*/
int main()
{
Show();
return 0;
}
以下为改良版
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 30
typedef struct Student node; //利用链表结构存储学生信息
struct Student
{/*数据域*/
int num;//学号
char name[20];//姓名
char sex[10];//性别
int age;//年龄
/*指针域*/
node* next;//指向下一个学生
node* previous;//指向上一个学生
};
FILE *fp;
/*建立文件基本信息*/
void BuildFile(node* head)
{
node* p = head;
fp=fopen("D:\\1.txt","w+");
if(!fp)
{
printf("文 件 打 开 失 败!");
exit(0);
}
if(!p){
printf("\n文 件 已 清 空 !\n");
fclose(fp);
}
if(p){
fprintf(fp,"%s\n","=====学生个人信息=====");
while(p){
fprintf(fp,"%s\n","----------------------------");
fprintf(fp,"%s%15d\n%s%15s\n%s%15s\n%s%15d\n","学号:",p->num,"姓名:",p->name,"性别:",p->sex,"年龄:",p->age);
p = p->next;
}
fclose(fp);
printf("\n文 件 成 功 建 立 !!!\n");
}
}
/*主菜单*/
void show()
{
printf("================================主菜单================================\n");
printf("1,添加学生信息 \n");
printf("2,查询学生信息 (按学号或姓名查询) \n");
printf("3,修改学生信息\n");
printf("4,删除学生信息\n");
printf("5,对学生按照学号排序并输出其信息 \n");
printf("6, 退 出 \n");
printf("======================================================================\n");
}
/*输入n个学生信息*/
node* Input(int n)
{
node* p = NULL;
node* head =NULL;
int i = 1;
while(i <= n)
{
printf("------------------------------------\n");
if(!head){
head = p =(node *)malloc(sizeof(struct Student));
/*输入学生基本信息*/
printf("输入学生学号:\t");
scanf("%d",&p->num);
printf("输入学生姓名:\t");
scanf("%s", p->name);
printf("输入学生性别:\t");
scanf("%s", p->sex);
printf("输入学生年龄:\t");
scanf("%d", &p->age);
p->previous = NULL;
p->next = NULL;
}else{
p->next = (node*)malloc(sizeof(struct Student));
/*输入学生基本信息*/
printf("输入学生学号:\t");
scanf("%d",&p->next->num);
printf("输入学生姓名:\t");
scanf("%s", p->next->name);
printf("输入学生性别:\t");
scanf("%s", p->next->sex);
printf("输入学生年龄:\t");
scanf("%d", &p->next->age);
p->next->next = NULL;
p->next->previous = p; //指向自己
p = p->next;
}
++i;
}
BuildFile(head);
return head;
}
/*添加学生信息*/
node* Add(node* p)
{
system("cls");
show();
int n;
printf("\n请输入添加几个学生的信息:\t");
scanf("%d",&n);
if(p==NULL){//再次调用
node* p = Input(n);
return p;
}
node* head = p;
while(n>0){
if(p->next==NULL){
p->next = (node*)malloc(sizeof(struct Student));
/*输入学生基本信息*/
printf("\n输入学生学号:\t");
scanf("%d",&p->next->num);
printf("输入学生姓名:\t");
scanf("%s", p->next->name);
printf("输入学生性别:\t");
scanf("%s", p->next->sex);
printf("输入学生年龄:\t");
scanf("%d", &p->next->age);
p->next->next = NULL;
p->next->previous = p;
n--;//次数减一
}
p = p->next;
}
BuildFile(head);
return head;
}
/*寻找学生信息*/
node* Search(node* p)
{
system("cls");
show();
if(!p){
printf("\n无 法 查 询!\n");
return NULL;
}
int k;//n下岗了
node* p1 = p;
node* p2 = p;
char n[N];//一个汉字占俩个字节
printf("\n请输入查询的方式(选择输入:学号或姓名):\t");
scanf("%s", n);
if(strcmp(n,"学号")==0){
printf("\n请输入您需要查找的学生学号:\t");
scanf("%d", &k);
while(p1){
if(p1->num==k){
printf("\n------------------------------------\n");
printf("学生学号:%5d\n学生姓名:%5s\n学生性别:%5s\n学生年龄:%5d\n\n",p1->num,p1->name,p1->sex,p1->age);
printf("\n查 询 成 功 !\n");
return p;
}
p1 = p1->next;
}
}
char b[N];
if(strcmp(n,"姓名")==0){
printf("\n请输入您需要查找的学生姓名:\t");
scanf("%s", b);
while(p2){
if(strcmp(p2->name, b)==0){
printf("\n------------------------------------\n");
printf("学生学号:%5d\n学生姓名:%5s\n学生性别:%5s\n学生年龄:%5d\n\n",p1->num,p1->name,p1->sex,p1->age);
printf("\n查 询 成 功 !\n");
return p;
}
p2 = p2->next;
}
}
printf("\n查 无 此 人 !\n");
return p;
}
/*修改学生信息*/
node* Change(node* p)
{
system("cls");
show();
if(!p){
printf("\n无 法 修 改 !\n");
return NULL;
}
node* head = (node*)malloc(sizeof(node));//头结点
head->next = p;
head->previous = NULL;
p->previous = head;
int n;
node *p3;//p3在需要改的节点处保存p
printf("\n请输入您需要修改学生的信息的学号:\t");
scanf("%d", &n);
while(p){
if(p->num==n&&p->next!=NULL){
node* p4=(node*)malloc(sizeof(node));
p->previous->next = p4;
p4->previous = p->previous;
p4->next = p->next;
p->next->previous = p4;
p->next = NULL;
p->previous = NULL;
free(p);
printf("\n------------------------------------\n");
/*输入修改的学生信息*/
printf("输入修改后的学生学号:\t");
scanf("%d",&p4->num);
printf("输入修改后的学生姓名:\t");
scanf("%s", p4->name);
printf("输入修改后的学生性别:\t");
scanf("%s", p4->sex);
printf("输入修改后的学生年龄:\t");
scanf("%d", &p4->age);
printf("\n");
node* head_x;
head_x = head->next;//保存
head_x->previous = NULL;
head->next = NULL;
free(head);
printf("\n修 改 成 功 !\n");
BuildFile(head_x);
return head_x;
}
else if(p->num==n&&p->next==NULL){//最后一个
node* p4=(node*)malloc(sizeof(node));
p4->previous = p->previous;
p->previous->next = p4;
p->previous = NULL;
free(p);
printf("\n------------------------------------\n");
/*输入修改的学生信息*/
printf("输入修改后的学生学号:\t");
scanf("%d",&p4->num);
printf("输入修改后的学生姓名:\t");
scanf("%s", p4->name);
printf("输入修改后的学生性别:\t");
scanf("%s", p4->sex);
printf("输入修改后的学生年龄:\t");
scanf("%d", &p4->age);
printf("\n");
node* head_x;
head_x = head->next;//保存
head_x->previous = NULL;
head->next = NULL;
free(head);
printf("\n修 改 成 功 !\n");
BuildFile(head_x);
return head_x;
}
p = p->next;
}
node* head_x;
head_x = head->next;//保存
free(head);
printf("\n查 无 此 人 ,无 法 修 改 !\n");
return head_x;
}
/*删除学生信息*/
node* Delete(node* p)
{
system("cls");
show();
if(!p||p->next==NULL){
printf("删 除 成 功 !\n");
BuildFile(NULL);
return NULL;
}
int n;
node* head = (node* )malloc(sizeof(node));//空的头节点
head->next = p;//建立联系
p->previous = head;
head->previous = NULL;
printf("\n请输入您要删除的学生信息的学号:\t");
scanf("%d", &n);
while(p){
if(p->num==n&&p->next!=NULL){
p->previous->next = p->next;
p->next->previous = p->previous;
free(p);
printf("\n删 除 成 功 !\n");
BuildFile(head->next);
return head->next;
}
else if(p->num==n&&p->next==NULL){//最后一个结点
free(p);
printf("\n删 除 成 功 !\n");
BuildFile(head->next);
return head->next;
}
p = p->next;
}
printf("\n删 除 失 败 !\n");
}
/*根据学生学号排序*/
node* Order(node* p)
{
system("cls");
show();
if(p==NULL){//空
printf("学 生 信 息 为 空,排 序 失 败!\n");
BuildFile(NULL);
return NULL;
}
else if(p->next==NULL){//只有一个
printf("学生学号:%5d\n学生姓名:%5s\n学生性别:%5s\n学生年龄:%5d\n",p->num,p->name,p->sex,p->age);
printf("\n排 序 成 功 !\n");
return p;
}
node* head;
node* p1 = p;//计算长度
node* p2 = (node*)malloc(sizeof(node));//空节点
p2->next = p;
head = p2;//保存空节点
/*计算出元素个数*/
int count = 0;
while(p1){
count++;
p1 = p1->next;
}
/*选择排序法*/
for(int i=1; i<count; i++){
for(int j=1; j<count+1-i; j++){
if(p->num > p->next->num){
p2->next = p->next;
p->next->next->previous = p;
p->next = p2->next->next;
p->previous = p2->next;
p2->next->next = p;
p2->next->previous = p2;
}
else{
p2 = p2->next;
p = p->next;
}
}
p2 = head;
p = head->next;
}
/*输出学生全部数据*/
node* p3, *p4;
p3 = p4 = head->next;//用来输出学生数据
while(p3){
printf("------------------------------------\n");
printf("学生学号:%5d\n学生姓名:%5s\n学生性别:%5s\n学生年龄:%5d\n",p3->num,p3->name,p3->sex,p3->age);
p3 = p3->next;
}
free(head);
printf("\n排 序 成 功 !\n");
BuildFile(p4);
return p4;
}
void Close(node* p)
{
node* head;
char b[N];
while(p){ //释放全部空间
head = p;
p = p->next;
free(head);
}
printf("\n是 否 保 存 文 件 ?(选择:yes或no)\n");
scanf("%s", b);
if(strcmp(b, "no")==0){
BuildFile(NULL);
}
exit(0);
}
int main()
{ /*首先进行输入学生信息操作*/
int n,choice;
printf("请输入您需要输入几个学生的信息:\t");
scanf("%d",&n);
printf("<请在下面输入学生基本信息>\n");
node *p = Input(n);
printf("\n");
show();
/*显示主菜单*/
while (1)
{
printf("本程序实现五大功能,您可以选择哪个功能(1~5):\t");
scanf("%d",&choice);//输入数字
switch (choice)
{
case 1:
p = Add(p);break;
case 2:
p = Search(p);break;
case 3:
p = Change(p);break;
case 4:
p = Delete(p);break;
case 5:
p = Order(p);break;
case 6:
Close(p);break;
default:
printf("\n数据错误!!!\n");
break;
}
printf("\n");
}
return 0;
}