鱼C论坛

 找回密码
 立即注册
查看: 1421|回复: 1

[技术交流] 学生信息管理系统bug

[复制链接]
发表于 2021-11-13 09:11:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
typedef struct student     //结构体
{
        char name[50];           
        char xingbie[10];
    char zhuanye[10];
    char birthday[10];
        char address[20];
        char Escore[20];
        struct student *next;
}stu;


void xinzeng(stu *head);
void shanchu(stu *head);
void daoru(stu *head);
void sousuo(stu *head);
void tongji(stu *head);
void paixu(stu *head);
void baocun(stu *head);

/////新增学生信息!/////


void xinzeng(stu *head)
{       
        system("cls");      //清屏!  
         stu *p=head;
        int a;
        printf("请输入你想新增几个新生信息\n");
        
        scanf("%d",&a);
        int c=0;
            for(int n=0;n<a;n++)
           {
                   stu *p1=(stu*)malloc(sizeof(stu));
        c++;
            printf("请输入第%d个新生的信息\n",c);
        printf("请输入名字:");
           scanf("%s",&p1->name);
        printf("请输入性别:");
           scanf("%s",&p1->xingbie);
        printf("请输入专业: ");
           scanf("%s",&p1->zhuanye);   
        printf("请输入出生日期: ");
           scanf("%s",&p1->birthday);
        printf("请输入地址:");
           scanf("%s",&p1->address);
        printf("请输入英语成绩: ");
       scanf("%s",&p1->Escore);
    p->next=p1;
    p=p->next;
        printf("添加成功!!\n");
    }
    p->next=NULL;
    printf("\n创建完毕!\n");
    getchar();
        system("cls");
        return;       //返回主函数!
}

/////删除学生信息!///////

void shanchu(stu *head)
{
       
        stu *p1, *p2;//定义两个指向学生结构的指针
        p1=head;//把头节点赋值给p1
        p2=p1->next;//把p1下一个节点赋值给p2
        char name[100];
        printf("请输入删除学生的名字:  ");
        scanf("%s",name);
        while(p2!=NULL)//判断p1是否为空节点
        {
                while(strcmp(name,p2->name)==0)//比较删除的名字与原先的是否相同
                {
                        p1->next=p2->next;
                        free(p2);//释放删除后的p2节点
                        printf("删除成功!\n");
                        return;
                }
            p1=p2;//从头节点进入下一个节点
                p2=p2->next;//遍历
                system("cls");//清屏
        }
        if(p2==NULL||strcmp(name,p2->name)!=0)//判断p2为空节点 没储存内容
        {
                printf("请先输入学生信息!!\n");
        }

}

//void daoru(stu*head)
//{//尾插法
//        stu *p,*p1;
//        p1=(stu*)malloc(sizeof(stu));
//        p1->next=NULL;
//        p = head;
//                   printf("姓名:\n");
//                scanf("%s",&p1->name);
//                printf("性别:\n");
//                scanf("%s",&p1->xingbie);
//                printf("专业:\n");
//                scanf("%s",&p1->zhuanye);
//                printf("出生日期: \n");
//                scanf("%s",&p1->birthday);
//                printf("地址: \n");
//                scanf("%s",&p1->address);
//                printf("英语成绩:\n");
//                scanf("%s",&p1->Escore);
//        while(p->next!=NULL)
//        {
//                p=p->next;
//        }
//        p->next=p1;
//        p=p1;
//        printf("插入成功!\n");       
//}

void daoru(stu*head)
{
  //头插法
        int n,i;
        stu *p,*p1;
        p=(stu*)malloc(sizeof(stu)); //开辟p的指针空间
        p1=(stu*)malloc(sizeof(stu));//开辟p1的指针空间
        p = head; //把头节点赋值给p
        p1=p->next;
        if(p1==NULL) //判断p1是否为空节点
        {
                printf("插入失败\n");
                exit(1);
        }
    for(i=0;i<n;i++);
    {
                   printf("姓名:\n");
                scanf("%s",&p1->name);
                printf("性别:\n");
                scanf("%s",&p1->xingbie);
                printf("专业:\n");
                scanf("%s",&p1->zhuanye);
                printf("出生日期: \n");
                scanf("%s",&p1->birthday);
                printf("地址: \n");
                scanf("%s",&p1->address);
                printf("英语成绩:\n");
                scanf("%s",&p1->Escore);
        }
        p1->next=head->next;//插入p1后的位置(头插法的链表)
        head->next=p1;//使链表运动下去
        p1=p1->next;//进行遍历
        printf("插入成功!\n");
}


///////学生信息搜索////

void sousuo(stu *head)
{
        stu *p=head;
        char n[20];
        system("cls");
        printf("请输入需查找同学的姓名\n");
        scanf("%s",n);
        while(p->next!=NULL)
        {
                if(strcmp(p->next->name,n)==0)
                {
                        printf("名字:%s    ",p->next->name);
                        printf("性别:%s    ",p->next->xingbie);
                        printf("专业:%s    ",p->next->zhuanye);
                        printf("出生日期:%s   ",p->next->birthday);
                        printf("地址:%s    ",p->next->address);
                        printf("英语成绩:%s\n",p->next->Escore);
                        return;
                }
        p=p->next;
        if(p->next==NULL)
          {
                printf("没有这名学生的信息!!\n");
                return;
          }
        }
}
      
      

  
                
  
void paixu(stu *head)      
{
                stu *p,*p1,*q;
        p=head;
        p1=head->next;
        system("cls");
        while(p->next!=NULL)
        {
                while(p1->next!=NULL)
                {
                        if(p->next->Escore<p1->next->Escore)
                        {
                                q=p->next;
                                p->next=p1->next;
                                p1->next=p1->next->next;
                                p->next->next=q;
        
                        }
                        else
                        {
                                p1=p1->next;
                        }
                }
                p=p->next;
                p1=p->next;
        }
        p=head->next;
        printf("按总成绩从高到低排名如下: \n");
        while(p)
        {
                printf("名字: %s    ",p->name);
                printf("性别:%s    ",p->xingbie);
            printf("专业: %s    ",p->zhuanye);
            printf("出生日期: %s    ",p->birthday);
                printf("地址: %s    ",p->address);
                printf("英语成绩: %s\n",p->Escore);
                p=p->next;
        }
}
  

        void baocun(stu*head)
{
        FILE *fp;//文件和目录路径名的指针fp指针指向FILE类型
        fp=fopen("D:\\新生管理系统.txt","w");//文件名使用方式
        stu *p=head;
        p=p->next;
        system("cls");
        if(fp!=NULL)
        {
                while(p!=NULL)
                {
                        fprintf(fp,"名字:%s        ",&p->name);
                    fprintf(fp,"性别:%s        ",&p->xingbie);
                        fprintf(fp,"专业:%s        ",&p->zhuanye);
                        fprintf(fp,"出生日期:%s    ",&p->birthday);
                        fprintf(fp,"地址:%s        ",&p->address);
                        fprintf(fp,"英语成绩:%s\n   ",&p->Escore);
                        p=p->next;
                }
                fclose(fp);
                printf("已保存至D盘!\n");
        }
        else
         {
                printf("错误!!");
         }
}


///////主函数!/////
         
int main()
{
                struct student stu[100];
        int s;
        student *head=(student*)malloc(sizeof(student));
        head->next=NULL;
        system("cls");
        while(1)
        {
        printf("\n\n\n");
        printf("-------------- ** 新生管理系统 ** -----------------\n");
        printf("\t        1.新增学生信息     \n");//
        printf("\t        2.删除学生信息     \n");//
        printf("\t        3.导入学生信息     \n");//
        printf("\t        4.学生信息搜索     \n");//
        printf("\t        5.学生信息统计     \n");
        printf("\t        6.英语成绩排序     \n");
        printf("\t        7.学生信息保存     \n");
        printf("\t        8.退出             \n");
        printf("--------------------请选择-----------------------\n");
        fflush(stdin);                //清空输入缓冲区
        scanf("%d",&s);
        switch(s)
               {
            case 1:             //printf("添加学生信息!\n");
                xinzeng(head);
                system("pause");
                break;
        
              case 2:             //printf("查看删除信息!\n");
                  shanchu(head);
                  system("pause");
                  break;
              case 3:
                daoru(head);            //printf("查看导入信息\n");
                system("pause");
                break;
            case 4:
                sousuo(head);           //printf("查看搜索信息!\n");
                system("pause");
                break;
            case 5:
                    tongji(head);           //统计学生信息!
                    system("pause");
                    break;
            case 6:
                paixu(head);           //学生英语成绩排序!
                break;
            case 7:
                            baocun(head);           //保存学生信息!
                            system("pause");
                        break;
                    
                    case 8:
                          
                                  exit(0);                        //退出系统!
                  break ;
            }
        }
  }
         

新增学生信息后,排序可正常运行,也能成功插入,但是插入信息后再次排序,新插信息不参与排序,只有新增的信息可以正常排序。(插入的文件名是daoru)       
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-13 10:02:04 | 显示全部楼层
本帖最后由 jhq999 于 2021-11-13 10:13 编辑
  1. p=(stu*)malloc(sizeof(stu)); //开辟p的指针空间
  2.         p1=(stu*)malloc(sizeof(stu));//开辟p1的指针空间
  3.         p = head; //把头节点赋值给p,前面申请的内存已经白申请了,
  4.         p1=p->next;//这个也是
复制代码

  1. void daoru(stu*head)
  2. {
  3.   //头插法
  4.         int n,i;
  5.         stu *p,*p1;
  6.         ////////////p=(stu*)malloc(sizeof(stu)); //开辟p的指针空间
  7.         p1=(stu*)malloc(sizeof(stu));//开辟p1的指针空间
  8.       
  9.         if(p1==NULL) //判断p1是否为空节点
  10.         {
  11.                
  12.                 printf("插入失败\n");
  13.                 exit(1);
  14.         }
  15.         p = head; //把头节点赋值给p
  16.         p1.next=p->next;
  17.         p->next=p1;
  18.   
  19.                 printf("姓名:\n");
  20.                 scanf("%s",&p1->name);
  21.                 printf("性别:\n");
  22.                 scanf("%s",&p1->xingbie);
  23.                 printf("专业:\n");
  24.                 scanf("%s",&p1->zhuanye);
  25.                 printf("出生日期: \n");
  26.                 scanf("%s",&p1->birthday);
  27.                 printf("地址: \n");
  28.                 scanf("%s",&p1->address);
  29.                 printf("英语成绩:\n");
  30.                 scanf("%s",&p1->Escore);
  31.       
  32.         printf("插入成功!\n");
  33. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-22 16:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表