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

struct student { char num[40]; //学号 char name[40]; //学生姓名 char sex[10]; //学生性别 int age; //学生年龄 struct student *next;//下一结点指针 }; typedef struct student EMP; EMP *h;

void load(); //读文件数据,并创建链表 void save(); //将链表中数据写到文件中 void add(EMP *p); //链表中增加学生结点 void del(char *s); //链表中删除指定姓名的学生结点 void update(); //链表中更新学生结点中的数据 void browse(); //在屏幕上显示链表中所有结点数据 void menu(); //显示系统主菜单 void delEmp(); //删除学生数据 void addEmp(); //增加学生数据 void sortEmp(); //排序学生数据 void searchByName(); //按姓名查询学生 void searchByAge(); //按年龄查询学生

int main() {

int op;//operation
h =(EMP *)malloc(sizeof(EMP));   //创建链表的头结点
h->next = NULL;              //初始化链表头节点中下一节点指针为NULL
menu();
scanf('%d',&op);
while(op!=0)
{
    switch(op)
    {
        case 1:
            load();
            break;
        case 2:
            save();
            break;
        case 3:
            addEmp();
            break;
        case 4:
            delEmp();
            break;
        case 5:
            update();
            break;
        case 6:
            browse();
            break;
        case 7:
            sortEmp();
            break;
        case 8:
            searchByName();
            break;
        case 9:
            searchByAge();
            break;
        default:
            printf('Invalid input, please try again.\n');
            break;
    }
    menu();
    scanf('%d',&op);
}
return 0;

}

//显示系统主菜单函数 void menu() { printf(' Main Menu\n'); printf(' ********************** \n'); printf(' * 0:quit 1 :load * \n'); printf(' * 2:save 3 :add * \n'); printf(' * 4:delete 5 :update * \n'); printf(' * 6:browse 7 :sort * \n'); printf(' * 8:search by name * \n'); printf(' * 9:search by age * \n'); printf(' ********************** \n'); }

//读文件数据,并创建链表函数 void load() { FILE *fp; EMP *node; fp = fopen('data.txt','r'); if(fp==NULL) { printf('Failed to open the file, please check if it exists.\n'); return; } while(!feof(fp)) { node =(EMP *)malloc(sizeof(EMP)); node->next = NULL; fscanf(fp,'%s%s%s%d',node->num,node->name,node->sex,&node->age);//从文件中读一行学生信息 add(node); // 调用函数增加链表结点 } fclose(fp); }

//链表中增加学生结点的函数 void add(EMP *p) { EMP *q; q = h->next; //将q指针指向链表中第一个学生结点 if(q==NULL) //如果q指针为NULL,则表示当前链表为空 { h->next = p; //p指针指向的结点为链表中第一个结点 p->next = NULL; } else { while(q->next!=NULL) //通过while循环找到链表中最后一个结点 { q = q ->next; } q->next = p; //将q指针指向的最后一个结点的next指针指向新增结点 p->next =NULL; //现在p指针指向的是最后一个结点,因此将该节点的next指针设为NULL }

}

//增加学生数据函数 void addEmp() { EMP *node; node = (EMP *)malloc(sizeof(EMP)); node->next = NULL; printf('Please input the student's number name sex age:\n'); scanf('%s%s%s%d',node->num,node->name,node->sex,&node->age); add(node); }

//删除学生数据函数 void delEmp() { char name[40]; printf('Please input the name of the student you want to delete:\n'); scanf('%s',name); del(name); }

//在屏幕上显示链表中所有学生结点数据函数 void browse() { EMP *node; node = h->next; //node指针指向链表第一个结点 printf('Student's num name age sex\n'); while(node) //遍历链表 { printf('%12s%9s%4d%5s\n',node->num,node->name,node->age,node->sex); node = node->next; //node指针指向下一个学生结点 } printf('\n'); }

//将链表中数据写到文件中的函数 void save() { FILE *fp; EMP *node; fp = fopen('data.txt','w'); //以写的方式打开文件 node = h->next; //node指针指向链表第一个结点 while(node!=NULL) { //'%s %s %s %d\n' 格式符之间有空格 fprintf(fp,'%s %s %s %d\n',node->num,node->name,node->sex,node->age); node = node ->next; } fclose(fp); }

//删除学生结点的函数 void del(char *s) { EMP *p,*q; p = h;//链表中第一个节点 q = p->next;//链表中第二个节点 while(q!=NULL) { if(strcmp(s,q->name)==0) { p->next = q->next; free(q); printf('Successfully deleted the student named %s.\n', s); return; } p = q; q = q->next; } printf('No student named %s was found.\n', s); }

//更新学生结点的函数 void update() { char name[40]; int flag = 0; EMP *p; printf('Please input the name of the student you want to update:\n'); scanf('%s',name); p = h->next; while(p!=NULL) { if(strcmp(name,p->name)==0) { printf('Please input the new age:\n'); scanf('%d',&p->age); printf('Please input the new sex:\n'); scanf('%s',p->sex); flag = 1; printf('Successfully updated the information of student %s.\n', name); break; } p=p->next;

}
if(flag==0)
{
    printf('No student named %s was found.\n', name);
}

}

//排序学生结点的函数 void sortEmp() { int n = 0, i, j; EMP *p, *q, *t; p = h->next; while (p != NULL) { n++; p = p->next; } for (i = 0, p = h->next; i < n - 1; i++, p = p->next) { for (j = i + 1, q = p->next; j < n; j++, q = q->next) { if (p->age > q->age) { t = (EMP *)malloc(sizeof(EMP)); memcpy(t, p, sizeof(EMP)); memcpy(p, q, sizeof(EMP)); memcpy(q, t, sizeof(EMP)); free(t); } } } printf('Sort success!\n'); }

//按姓名查询学生 void searchByName() { char name[40]; int flag = 0; EMP *p; printf('input the name:\n'); scanf('%s',name); p = h->next; while(p!=NULL) { if(strcmp(name,p->name)==0) { printf('Student's num name age sex\n'); printf('%12s%9s%4d%5s\n',p->num,p->name,p->age,p->sex); flag = 1; } p=p->next;

}
if(flag==0)
{
    printf('No such Student\n');
}

}

//按年龄查询学生 void searchByAge() { int age; int flag = 0; EMP *p; printf('input the age:\n'); scanf('%d',&age); p = h->next; while(p!=NULL) { if(p->age==age) { printf('Student's num name age sex\n'); printf('%12s%9s%4d%5s\n',p->num,p->name,p->age,p->sex); flag = 1; } p=p->next;

}
if(flag==0)
{
    printf('No such Student\n');
}
C语言学生信息管理系统代码优化:链表操作与数据处理

原文地址: https://www.cveoy.top/t/topic/ordK 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录