OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4051|回复: 2

如代码所示,在运行‘c’和‘d’后代码出现崩溃,但是单步执行却可以运行代码无问题。不知道崩溃的原因。望指教

[复制链接]

2

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2017-7-23
在线时间
20 小时
发表于 2017-7-26 14:18:43 | 显示全部楼层 |阅读模式
1金钱

#include <stdio.h>
#include <malloc.h>
#include <conio.h>
#include <stdlib.h>
void print(struct student *head);
struct student *insert(struct student *stu_2,struct student *head);
void KeepMessage(struct student *head);
//链表单元定义,链表相关变量
unsigned int                 Prin_n;
struct student
{
    int id;
    float score;
        char name[20];
        char sex[20];
    struct student *next;
} *head,*pthis;

//输入数据创建链表
void input()
{
    struct student *tmp;
        FILE *fp;
    printf("\n\n请输入学生的信息以学号为0结束!!:\n");
        if(!(fp=fopen("student_list","wb")))//打开文本
        {
                printf("cannot\n");
                return;
        }
        do
        {
               
        printf("ID\t成绩\t姓名\t性别\t以Tab或者回车输入\n");

                if ((tmp=(struct student *)malloc(sizeof(struct student)))==NULL)//申请内存
                {
            printf("\n错误!不能申请所需的内存!\n");
            exit(0);
        }
        scanf("%d\t%f\t%s\t%s",&tmp->id,&tmp->score,tmp->name,tmp->sex);//输入信息
                fwrite(tmp,sizeof(struct student),1,fp);
        tmp->next=NULL;

                if (tmp->id!=0)
                {       
                       
            if (head==NULL)
                        {
                head=tmp;
                pthis=head;
            }
                        else
                        {
                pthis->next=tmp;
                pthis=pthis->next;
            }
        }
        else
        {
                tmp->next=NULL;
        }
       
       
    } while (tmp->id!=0);
         
        fclose(fp);        //关闭文件
        free(tmp);//释放内存地址
       
}

void  KeepMessage(struct student *head)//保存数据函数存入二进制文件
{
        FILE *fp;
        struct student *bianl;
        bianl=head;
        if(!(fp=fopen("student_list","wb")))
                {
                        printf("cannot\n");
                        return;
                }             
        do{
                fwrite(bianl,sizeof(struct student),1,fp);
                bianl=bianl->next;
                }while(bianl!=NULL);

        fclose(fp);
//        return temp;       

}

//搜索链表找到第一个符合条件的项目输出
void search(int id)
{       
        FILE *fp;
    printf("\n\n查询结果\n");
    printf("ID\t成绩\n");
    printf("-------------------------------\n");
       
        if(!(fp=fopen("student_list","r")))//防止无文件
        {
                printf("不能读写\n");
                return ;
        }
    if (head==NULL)
        {
        printf("\n错误!没有数据!\n");
        return;
    }
    pthis=head;
    while (pthis!=NULL)
        {
        if (pthis->id==id)
                {
            printf("%d\t%.2f %s %s\n",pthis->id,pthis->score,pthis->name,pthis->sex);
            return;
        }
                else
                {
            pthis=pthis->next;
        }
    }
    printf("\n没有找到!\n");
}

//列表输出链表中的所有项排序
void list()
{
        struct student *view_sort_chinese(struct student *h);
        FILE *fp;
        void print(struct student *head);
                if(!(fp=fopen("student_list","r")))
        {
                printf("不能读写\n");
                return ;
        }
    printf("\n\n数据列表\n");
    printf("ID\t成绩\t姓名\t性别\t\n");
    printf("-------------------------------\n");
        printf("按学号排序如下\n");
        printf("-------------------------------\n");

       
    if (head==NULL)
        {
        printf("错误,没有数据!\n");
        return;
    }
        print (view_sort_chinese(head));


}
struct student *view_sort_chinese(struct student *h)  //冒泡排序      
{

                //在调用函数里面判断head=NULL,这里不判断。
                struct student *endpt,*u,*v,*p;     
                u = (struct student *)malloc(sizeof(head));   
                u->next=h;   
                h=u;  

                for(endpt=NULL;endpt!=h;endpt=p)
                {
                        for(p=u=h;u->next->next!=endpt;u=u->next)  
                        {
                                if(u->next->id > u->next->next->id)
                                {                           
                                        v=u->next->next;   
                                        u->next->next=v->next;   
                                        v->next=u->next;   
                                        u->next=v;   
                                        p=u->next->next;   
                                }
                        }
                }
                u=h;   
                h=h->next;
                head=h;
                return head;
}

void print(struct student *head)//打印文本
        {
                                struct student *p;
                                p=head;
                                if(head)
                                {
                                                do
                                        {
                                                printf("%d\t%.2f %s %s\n",p->id,p->score,p->name,p->sex);
                                                p=p->next;
                                        }while(p!=NULL);//只打印大于0的数;&&(p->id>0)
                                }
                                else
                                {
                                        printf("打印错误,文件为空\n");
                                }

        }



//追加数据
struct student *insert(struct student *hea,struct student *stu)//
{
        struct student *p0,*p1;
       
        p1 = hea;
        p0 = stu;
        if(NULL  == hea)
        {
                head=p0;
                p0->next=NULL;
                return head;
        }
        else
        {
                p0->next=hea;
                head=p0;
       
        }
        KeepMessage(head);
        return head;
}

//删除数据
struct student *del(int num)
{
        struct student *p1,*p2;
        if(NULL==head)
        {
                printf("\nthis list is null!\n");
                return head;
        }

        p1=head;
        while(p1->id != num && p1->next != NULL)
        {
                p2=p1;
                p1=p1->next;
        }
        if(num==p1->id)
        {
                if(p1==head)
                {
                        head=p1->next;
                }
                else
                {
                        p2->next=p1->next;
                }
                printf("\n删除成员:%d 成功!\n",num);
        }
        else
        {
                printf("%d没有找到!\n",num);
        }
       
        KeepMessage(head);
        return head;
       
}

struct student *load1()
{
        FILE *fp;

        struct student *temp;       
        head=NULL;
        if(!(fp=fopen("student_list","r")))
        {
                printf("不能读写,或无文件\n");
                return 0;
        }

        do
        {
                if ((temp=(struct student *)malloc(sizeof(struct student)))==NULL)
                {
                        printf("\n错误!不能申请所需的内存!\n");
                        exit(0);
                }
                fread(temp,sizeof(struct student),1,fp);
                temp->next=NULL;
                if(!(!feof(fp)&&(temp->id>0)))
                {
                        break;
                }
                        if (head==NULL)
                                {
                                        head=temp;
                                        pthis=head;
                                }
                                else
                                {
                                        pthis->next=temp;
                                        pthis=pthis->next;
                                }
        }while(!feof(fp)&&(temp->id>0));

        fclose(fp);
        return head;
       
}
struct student *load()
{
        FILE *fp;
        struct student *temp;       
        head=NULL;
        if(!(fp=fopen("student_list","r")))
        {
                printf("不能读写\n");
                return 0;
        }       
        do
        {
                if ((temp=(struct student *)malloc(sizeof(struct student)))==NULL)
                {
                        printf("\n错误!不能申请所需的内存!\n");
                        exit(0);
                }
                fread(temp,sizeof(struct student),1,fp);
                temp->next=NULL;

                        if (temp->id!=0)
                        {       
                               
                                if (head==NULL)
                                {
                                        head=temp;
                                        pthis=head;
                                }
                                else
                                {
                                        pthis->next=temp;
                                        pthis=pthis->next;
                                }
                        }

        }
        while (temp->id!=0);
       
        fclose(fp);
        return head;
}


void Dere_list()
{
                struct student *stu_2;
    char command=0;
    int id=0;
        int n;
        int i;
        do {
        printf("\n\n\t 菜单\n");
        printf("-------------------------------\n");
        printf("\ta,输入数据\n");
        printf("\tc,排列顺序\n");
        printf("\td,插入数据\n");
        printf("\te,查询数据\n");
        printf("\tf,删除记录\n");
                printf("\th,载入文本数据\n");
        printf("\tg,退出系统\n");
        printf("-------------------------------\n");
        printf("\t请选择:");       
        command=getch();
                printf("\n");
//命令处理
        switch (command)
                {
        case 'a':
            if (head==NULL)
                        {
                input();
                break;
            }
                        else
                        {
                printf("\n\n数据已经存在!\n");
                break;
            }
        case 'c':
            list();
            break;
        case 'd':
                if ((stu_2=(struct student *)malloc(sizeof(struct student)))==NULL)//申请stu_2内存,可以连续输入,以占用上次。
                {
                        printf("\n错误!不能申请所需的内存!\n");
                        exit(0);
                }
            printf("\nID\t成绩\t姓名\t性别\t以Tab或者回车输入\n");
                        scanf("%d\t%f\t%s\t%s",&stu_2->id,&stu_2->score,stu_2->name,stu_2->sex);
                        if(stu_2->id<0)
                                {
                                        printf("输入有误!\n");
                                }
                                print(insert(head,stu_2));
                        //        free(stu_2);
                               
            break;
        case 'e':
                        scanf("%d",&i);
                        search(i);
                        //print(head);

            break;
        case 'f':
                        printf("请输入学号ID\n");
            scanf("%d",&n);
                        print(del(n));
               
            break;
                case 'h':
                        load1();
                        print(head);
        }
    } while (command!='g');

        printf("按任意键退出\n");
}

//程序主函数
void main()
{

//主循环
        Dere_list();
       

}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

145

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2017-6-19
在线时间
55 小时
发表于 2017-7-26 18:16:06 | 显示全部楼层
没释放内存、有malloc应该要delete (如果没delete,那我可以new多个对象)
回复

使用道具 举报

2

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2017-7-23
在线时间
20 小时
 楼主| 发表于 2017-7-26 22:53:19 | 显示全部楼层
jokeym 发表于 2017-7-26 18:16
没释放内存、有malloc应该要delete (如果没delete,那我可以new多个对象)

是‘d’ 那个地方嘛?
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 04:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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