zhangyh0622 发表于 2021-11-13 09:11:21

学生信息管理系统bug

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
typedef struct student   //结构体
{
        char name;         
        char xingbie;
    char zhuanye;
    char birthday;
        char address;
        char Escore;
        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;
        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;
        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;
        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)       

jhq999 发表于 2021-11-13 10:02:04

本帖最后由 jhq999 于 2021-11-13 10:13 编辑

p=(stu*)malloc(sizeof(stu)); //开辟p的指针空间
      p1=(stu*)malloc(sizeof(stu));//开辟p1的指针空间
      p = head; //把头节点赋值给p,前面申请的内存已经白申请了,
      p1=p->next;//这个也是

void daoru(stu*head)
{
//头插法
      int n,i;
      stu *p,*p1;
      ////////////p=(stu*)malloc(sizeof(stu)); //开辟p的指针空间
      p1=(stu*)malloc(sizeof(stu));//开辟p1的指针空间
      
      if(p1==NULL) //判断p1是否为空节点
      {
               
                printf("插入失败\n");
                exit(1);
      }
      p = head; //把头节点赋值给p
      p1.next=p->next;
      p->next=p1;

                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);
      
      printf("插入成功!\n");
}
页: [1]
查看完整版本: 学生信息管理系统bug