开天辟地的卷毛 2022-06-24 09:43 采纳率: 85.4%
浏览 71
已结题

c语言学生管理信息链表sort排序操作问题


#include "stdio.h"
#include "student.h"
#include "stdlib.h"
#include "string.h"
#pragma warning(disable:4996)
/*
SL:学生信息组成的单链表
newStudent:需要加入进来的新的学生结点 
*/
STUDENT * tianjiaxuesheng(STUDENT * SL,STUDENT * newStudent)
{
    STUDENT *p1,*p2;
    //判断链接  SL是否 为空。
    if(SL==NULL)
    {
        SL=newStudent;
        newStudent->next=NULL;//将新加入结点的指针域,设置为NULL 
    } else
    {
        //定位链表的最后一个结点 
        p1=SL;//让p1指向链表 的第一个结点
        while(p1) 
        {
            p2=p1;
            p1=p1->next;
        };
        //当跳出while循环的时候,说明 p1已经指向链表的最后一个结点 
        p2->next=newStudent;
        newStudent->next=NULL;         
    }    
    return SL; 
}
STUDENT * ShanChu(STUDENT * SL,char xm[])
{
    STUDENT *p1,*p2;
    p1=SL;
    p2=SL;
    //检查是否是首结点
    if(strcmp(p1->xm,xm)==0) 
    {
        p2=p1->next;
        free(p1);
        return p2;
    }
    while(p1)
    {
        if(strcmp(p1->xm,xm)==0)//姓名匹配成功,执行删除操作 
        {
            p2->next=p1->next;
            free(p1);
            break;
        }
        p2=p1; 
        p1=p1->next;
    };
    return SL;
}
//对应菜单 添加  的函数 
STUDENT * TianJia(STUDENT * SL)
{    
    STUDENT *pNew;
    pNew=(STUDENT *)malloc(sizeof(STUDENT));
    int year,month,day;
    DATE cs={1976,1,15}; 
    char xm[20],mz[20],bj[20],dz[50],sj[12],ss[50];
    char xb;
    printf("请输入要添加的学生信息:\n");
    printf("姓名:");
    gets(xm);
    strcpy(pNew->xm,xm);
    printf("性别(M/F):");
    xb=getchar();
    getchar(); 
    pNew->xb=xb;
    printf("民族:");
    gets(mz);
    strcpy(pNew->mz,mz) ;
    printf("出生日期(year-month-day):");
    scanf("%d-%d-%d",&year,&month,&day);
    pNew->csrq.year=year;pNew->csrq.month=month;pNew->csrq.day=day;
    getchar();//吸收所按的回车键 
    printf("班级:");
    gets(bj);    
    strcpy(pNew->bj,bj);
    printf("地址:");
    gets(dz);    
    strcpy(pNew->dz,dz);
    printf("手机:");
    gets(sj);
    strcpy(pNew->sj,sj);
    printf("宿舍:");
    gets(ss);    
    strcpy(pNew->ss,ss);
    pNew->next=NULL;
        
    SL=tianjiaxuesheng(SL,pNew);
    //printf("TianJia-SL:%s\n",SL->bj); 
    return ;
}



void LiuLan(STUDENT *SL)
{
    printf("***学生信息浏览***\n");
    printf("姓名\t性别\t民族\t出生日期\t班级\t\t地址\t\t手机\t\t宿舍\n");
    STUDENT *p1,*p2;
    p1=SL;
    while(p1)
    {
        printf("%s\t%c\t%s\t%d-%d-%d\t%s\t%s\t%s\t%s\n",p1->xm,p1->xb,p1->mz,p1->csrq.year,p1->csrq.month,p1->csrq.day,p1->bj,p1->dz,p1->sj,p1->ss);
        p1=p1->next;
    };
    return ;
}
STUDENT * DaKai(STUDENT *SL) 
{
    FILE *fp;
    STUDENT *p1,*p2;
    fp=fopen("student.dat","rb");
    if(fp==NULL)
    {
        printf("文件打开失败\n");
        return;
    }
    while(1)
    {
        p1=(STUDENT *)malloc(sizeof(STUDENT));
        fread(p1,sizeof(STUDENT),1,fp);
        if(feof(fp))  break;//如果文件尾,则结束循环 
        SL=tianjiaxuesheng(SL,p1);
    }
    fclose(fp);
    return SL;
}
//修改指定姓名的学生信息 
STUDENT * XiuGai(STUDENT *SL,char xm[])
{
    STUDENT *p1,*p2;
    p1=SL;
    p2=SL;
    int k;
    char xmNew[20],xbNew,sjNew[12],bjNew[20], dzNew[50], ssNew[50],mzNew[20];
    int newyear,newmonth,newday;
    while(p1)
    {
        if(strcmp(p1->xm,xm)==0)//姓名匹配成功,执行修改操作 
        {
            printf("请选择你要修改的数据字段:\n");
            printf("1.姓名\n");
            printf("2.民族\n");
            printf("3.性别\n");
            printf("4.出生日期\n");
            printf("5.班级\n");
            printf("6.地址\n");
            printf("7.手机\n");
            printf("8.宿舍\n");
            scanf("%d",&k);
            getchar(); 
            switch(k)
            {
                case 1:
                       printf("请输入新的姓名:");
                       gets(xmNew);
                       strcpy(p1->xm,xmNew);
                       break;
                case 2:
                       printf("请输入新的民族:");
                       gets(mzNew);
                       strcpy(p1->mz,mzNew);
                       break;
                case 3:
                       printf("请输入新的性别(M/F):");
                       xbNew=getchar();
                       getchar();
                       p1->xb=xbNew;
                       break;                
                case 4:printf("出生日期(year-month-day):");
                       scanf("%d-%d-%d",&newyear,&newmonth,&newday);
                       p1->csrq.year=newyear;p1->csrq.month=newmonth;p1->csrq.day=newday;
                       getchar();
                       break;
                case 5:
                       printf("请输入新的班级:");
                       gets(bjNew);
                       strcpy(p1->bj,bjNew);
                       break;
                case 6:printf("请输入新的地址:");
                       gets(dzNew);
                       strcpy(p1->dz, dzNew);
                       break;
                case 7:printf("请输入新的手机:");
                       gets(sjNew);
                       strcpy(p1->sj, sjNew);
                       break;
                case 8:printf("请输入新的宿舍:");
                       gets(ssNew);
                       strcpy(p1->ss, ssNew);
                       break;
            } 
        }
        p2=p1; 
        p1=p1->next;
    };
    return SL;
}
void BAOCUN(STUDENT *SL)
{
    FILE *fp;
    STUDENT *p1,*p2;
    fp=fopen("student.dat","wb");
    if(fp==NULL)
    {
        printf("文件打开失败,无法保存学生信息。\n");
        return;
    }
    p1=SL;//让p1指向链表 的第一个结点
    while(p1) 
    {
        p2=p1;
        //将 p2所指向的结点数据,写入文件 fp
         fwrite(p2,sizeof(STUDENT),1,fp);
        p1=p1->next;
    };
    
    fclose(fp);
}
void sort(STUDENT* SL)
{
    //插入排序
    STUDENT* p1, * p2, * tmp;
    //p1指向头节点和第一个学生节点处断开
    p1 = SL; //p1指向第一个学生节点
    p2 = SL->next; //p2指向第二个学生节点
    while (p1)
    {
        while (p1->next != NULL && p1->sj > p2->sj)
            p1 = p1->next;

        p2->next = p1->next;
        p1->next = p2;
        p1 = tmp;
    }
    printf("链表排序完成!\n");
}
//student.h的代码
typedef struct date
{
    int year;
    int month;
    int day;
}DATE;
//姓名、性别、民族、出生日期、班级、地址、手机号码、宿舍
typedef struct student
{
    char xm[20];
    char xb;
    char mz[15];
    DATE csrq;
    char bj[20];
    char dz[50];
    char sj[12];
    char ss[14];
    struct student *next;
}STUDENT;



#include "stdio.h"
#include "caozuo.h"
#pragma warning(disable:4996)
int main()
{
    STUDENT * SL=NULL;//学生信息链表 
    char xm[20]; 
    //菜单
    printf("    **************学生成绩管理系统**************\n");
    printf("        *1.添加学生信息                            *\n"); 
    printf("        *2.删除学生信息                            *\n"); 
    printf("        *3.修改学生信息                            *\n"); 
    printf("        *4.浏览学生信息                            *\n");
    printf("        *5.保存学生信息                            *\n");    
    printf("        *6.打开文件                                *\n");
    printf("        *7.排序学生信息(以手机号)                *\n");
    printf("        *0.退出程序                                *\n");
    printf("    ********************************************\n");
    printf("                                                      \n");
    printf("请选择: "); 
    //等待用户的输入确认
    int M,T;
    char z;
    M=getchar();
    T=getchar();
    while(M!='0')
    {
        switch(M)
        {
            case '1':
                 SL=TianJia(SL);        
                  break;
            case '2':
                   printf("请输入要删除的学生信息:");
                   gets(xm);
                   SL=ShanChu(SL,xm);
                   break;
            case '3':
                   printf("请输入要修改的学生信息:");
                   gets(xm);
                   SL=XiuGai(SL,xm);
                   break;
            case '4':printf("进入浏览学生信息的界面。\n");
                    LiuLan(SL);
                    break;
            case '5':
                    BAOCUN(SL);
                    break; 
            case '6':
                    SL = DaKai(SL);
                    break;
            case '7':
                    sort(SL);
                    break;
            case '0':break; 
        } 
        //显示菜单
        printf("按任意键继续");
        getchar(); 
        system("cls");//本函数实现清屏的功能 
        printf("1.添加学生信息\n"); 
        printf("2.删除学生信息\n"); 
        printf("3.修改学生信息\n"); 
        printf("4.浏览学生信息\n"); 
        printf("5.保存学生信息\n"); 
        printf("6.打开文件\n");
        printf("7.排序学生信息(以手机号)\n");
        printf("0.退出程序\n"); 
        M=getchar();
        T=getchar();    
    }
}

我想问一下,在第一段代码中,我写的sort的排序哪里出错了吗,我运行的时候,可能是陷入了死循环,cpu温度很高,然后风扇也很大声,这段代码的排序操作具体要怎么做呀,我用手机号进行排序

  • 写回答

1条回答 默认 最新

  • emXiaoMing 2022-06-24 09:55
    关注

    你的tmp没初始化啊,是野指针,p1=tmp这样指向未知地址了,肯定跑不对

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 7月7日
  • 已采纳回答 6月29日
  • 创建了问题 6月24日

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值