学生成绩管理系统简易版(链表)

欢迎指出不足!

#include 
#include 
#include 

struct student
{
    int num;
    char name[100];
    int age;
    int score;

};
struct node
{
    struct student stu;
    struct node *next;
};

struct node *head=NULL;
//菜单
void menu()
{
    printf("==============欢迎使用高校学生成绩管理系统==============\n");
    printf("\t=======请选择功能列表=======\n");
    printf("\t\t1.录入学生信息\n");
    printf("\t\t2.打印学生信息\n");
    printf("\t\t3.保存学生信息\n");
    printf("\t\t4.读取学生信息\n");
    printf("\t\t5.查找学生信息\n");
    printf("\t\t6.修改学生信息\n");
    printf("\t\t7.删除学生信息\n");
    printf("\t\t0.退出系统\n");
}
//录入学生信息

void add()
{
    printf("\n请输入学生信息:学号 姓名 年龄 成绩\n");
    struct node *p;
    p=head;
    struct node *p1=(struct node*)malloc(sizeof(struct node));//为新同学分配内存空间

    if(head==NULL)
    {
        head=p1;
        p1->next=NULL;
    }
    else
    {
        while(p->next!=NULL)
        {
            p=p->next;//p指向最后一个节点
        }
        p->next=p1;//p的下一个节点为p1
        p1->next=NULL;
    }
    //输入数据
    scanf("%d %s %d %d",&p1->stu.num,p1->stu.name,&p1->stu.age,&p1->stu.score);
    printf("数据添加成功!\n");

}
//打印学生信息
void print()
{
    printf("打印所有学生信息:\n");
    struct node *p;
    p=head;
    printf("学号:\t\t姓名:\t\t年龄:\t\t成绩\n");
    while(p!=NULL)
    {
        printf("%-16d%-16s%-16d%-16d\n",
               p->stu.num,p->stu.name,p->stu.age,p->stu.score);
        p=p->next;

    }
}
//保存学生信息
void Save()
{
    FILE *p1=fopen("1.txt","w");
    if(p1==NULL)
    {
        printf("打开文件失败!\n");
        return ;

    }
    //写入数据
    struct node *p;
    p=head;
    while(p!=NULL)
    {
        fprintf(p1,"%d %s %d %d\n",p->stu.num,p->stu.name,p->stu.age,p->stu.score);
        p=p->next;

    }
    printf("数据保存成功!\n");
    fclose(p1);
}
//读取学员信息
void read()
{
    struct node *p,*p1;
    p=p1=head;
    //删除链表中的数据
    while(p1!=NULL)
    {
        p=p->next;
        free(p1);
        p1=p;

    }
    head=NULL;
    //打开文件
    FILE *pFile=fopen("1.txt","r");
    if(pFile==NULL)
    {
        printf("打开失败!\n");
        return;

    }
    else
    {
        while(!feof(pFile))
        {
            struct node *t=(struct node*)malloc(sizeof(struct node));
            fscanf(pFile,"%d %s %d %d\n",&t->stu.num,t->stu.name,&t->stu.age,&t->stu.score);
            //创建链表
            if(head==NULL)
            {
                head=t;
                p=head;
            }
            else
            {
                p->next=t;//p的下一个节点是t;
                p=p->next;
                p->next=NULL;
            }
        }
    }
    //关闭文件
    fclose(pFile);
    printf("读取成功!\n");



}
//查找学生信息
void search()
{
    int flag=0;
    printf("请输入要查找的学生的学号:\n");
    int num;
    scanf("%d",&num);
    struct node *p;
    p=head;
    while(p!=NULL)
    {
        if(p->stu.num==num)
        {
            printf("学号:%d\t姓名:%s\t年龄:%d\t成绩:%d\n",
                   p->stu.num,p->stu.name,p->stu.age,p->stu.score);
            flag++;
        }
        p=p->next;
    }
    if(flag==0)
        printf("未找到!\n");
}
//修改信息
void change()
{
    int flag=0;
    printf("请输入要修改的学生的学号:\n");
    int num;
    scanf("%d",&num);
    struct node *p;
    p=head;
    while(p!=NULL)
    {
        if(p->stu.num==num)
        {
            flag++;
            printf("%d\t%s\t%d\t%d\n",p->stu.num,p->stu.name,p->stu.age,p->stu.score);
            printf("是否确认修改?(Y/N)\n");
            char ch=getch();
            if(ch=='Y')
            {
                printf("请输入修改后的信息:\n");
                scanf("%d %s %d %d",&p->stu.num,p->stu.name,&p->stu.age,&p->stu.score);
                printf("修改成功!\n");
                break;
            }
            else
                break;
        }
        p=p->next;

    }
    if(flag==0)
        printf("未找到!\n");

}
//删除信息
void Delete()
{
    int flag=0;
    printf("请输入要删除的学生的学号:\n");
    int num;
    scanf("%d",&num);
    struct node *p1,*p2;
    p1=head->next;//p1指向头节点的下一个
    //判断是否是头节点
    if(head->stu.num==num)
    {
        p2=head;
        head=head->next;
        free(p2);
        printf("删除成功!\n");
        return;
    }
    //不是头节点;
    while(p1!=NULL)
    {
        if(p1->stu.num==num)
        {
            flag++;
            p2=p1;
            p1=p1->next;
            free(p2);
            printf("删除成功!\n");
            return;

        }
        p1=p1->next;

    }
    if(flag==0)
        printf("未找到!\n");

}
void add();
void print();
void Save();
void read();
void search();
void change();
void Delete();
//主函数
int main()
{
    while(1)
    {
        menu();
        printf("请输入选项:\n");
        char ch=getch();
        switch(ch)
        {
        case '1':
            add();
            break;
        case '2':
            print();
            break;
        case '3':
            Save();
            break;
        case '4':
            read();
            break;
        case '5':
            search();
            break;
        case '6':
            change();
            break;
        case '7':
            Delete();
            break;
        case '0':
            printf("\n欢迎再次使用!\n");
            return 0;
            break;
        default:
            printf("您的输入有误!\n");
            break;

        }
        system("pause");
        system("cls");
    }
    return 0;
}

你可能感兴趣的:(链表,c语言)