qq_46577501
2020-12-28 19:53
采纳率: 100%
浏览 87

请问一下为什么我这个程序在DEV C++上总是一运行就出错?感觉没什么错误呀

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h> 

//定义成员信息结构体(成员编号、姓名、年龄、性别、职位) 
typedef struct student_inf{
    char name_mber[20];
    char posit_mber[20];
    char gender_mber[10];
    int age_mber; 
    int serial_num;
    struct student_inf * next;
}*linklist;

linklist creat(void);
int show_all(linklist head);
int enquiry(linklist head);
int update(linklist head);
int delete_inf(linklist head);
int exit_list(void);
int search_serial_num(linklist head);
int search_name(linklist head);
int insert(linklist head);


int main( int argc, char * argv[] )
{
    int i,flag_exit=0;
    linklist head=NULL;
    head=(linklist)malloc(sizeof(linklist));

    while(1)
    {
        //1.清屏并清空缓存 
        system("cls");
        fflush(stdin);
        
        printf("---------------------xxxxx---------------------\n");
        printf("|                 人员信息系统                 |\n");
        printf("|菜单(输入序号):                             |\n");
        printf("|              1.录入成员信息                  |\n");
        printf("|              2.显示所有成员信息              |\n");
        printf("|              3.信息查询                      |\n");
        printf("|              4.修改成员信息                  |\n");
        printf("|              5.删除信息                      |\n"); 
        printf("|              6.插入信息                      |\n"); 
        printf("|              0.退出系统                      |\n");
        printf("-----------------------------------------------\n"); 
        
        //2.选择功能 
        scanf("%d",&i);
        switch(i)
        {
            case 1:
                    //2.1进入创建链表函数 
                    head=creat();
                    break;
            case 2:
                    //2.2进入显示信息函数 
                    show_all(head);
                    break;
            case 3:
                    //2.3进入查询信息函数 
                    enquiry(head);
                    break;
            case 4:
                    //2.4进入修改信息函数 
                    update(head);
                    break;
            case 5:
                    //2.5进入删除信息函数 
                    delete_inf(head);
                    break;
            case 6:
                    //2.6进入插入信息函数 
                    insert(head);
                    break;
            case 0:
                    //2.7将提出程序标志位赋为1 
                    flag_exit=1;
                    printf("感谢使用!!!!!\n"); 
                    break;
            default:
                    //2.8未找到以上功能 
                    printf("此项正在功能更新中!");
                    system("pause");
                    break; 
        }
        
        //3.检查是否退出该程序 
        if(flag_exit==1)
        {
            break;    
        }
    }

    return 0;
}

//插入信息 
int insert(linklist head)
{
    //1.检查是否为野指针 
    if ( head==NULL )
    {
        return -1;
    }
    
    // 2.清空缓存
    system("cls");
    fflush(stdin);
    
    linklist new_inf=NULL,obj=NULL;
    int insert_num,find_flag=0;
    obj=head->next;
    
    //3.选择在哪插入新信息 
    printf("在哪位成员编号后插入新成员(如:在成员编号2后插入新成员):");
    scanf("%d",&insert_num);
    
    //4.开始添加新信息 
    while(obj!=NULL)
    {
        // 4.1 找到要添加新信息的位置 
        if(obj->serial_num==insert_num)
        { 
            //4.1.1清屏并添加新信息 
            system("cls");
            new_inf=(linklist)malloc(sizeof(linklist));
            printf("请输入成员信息:(成员编号 姓名 性别 年龄 职务)\n");
            printf("成员编号:");
            scanf("%d",&new_inf->serial_num);    
            printf("姓名:");
            scanf("%s",new_inf->name_mber);    
            printf("性别:");
            scanf("%s",new_inf->gender_mber);    
            printf("年龄:");
            scanf("%d",&new_inf->age_mber);    
            printf("职务:");
            scanf("%s",new_inf->posit_mber);    
            
            //4.1.2将新信息加入到该信息表中 
            new_inf->next=obj->next;
            obj->next=new_inf;
            find_flag=1;
            break;
        }
        
        //4.2未找到就继续向下找 
        obj=obj->next; 
    }
    
    //5.检查是否成功添加新信息 
    if(find_flag==1)
    {
       printf("插入成功!!!\n"); 
        // 汇编:RET / RETI
    }
    else
    {
       printf("未找到此对象\n");  
    }
        
    system("pause"); 
    
    
    return 0;
}

//查询成员信息(选择查询方式) 
int enquiry(linklist head)
{
    // sleep ...
    // timeval 
    //1.检查是否为野指针 
    if ( head==NULL )
    {
        return -1;
    }
    
    int method,flag_enqry=0;
    
    //2.选择查询方式 
    while(1)
    {
        //2.1清屏并清空缓存 
        system("cls");
           fflush(stdin);
           
           //2.2选择查询方式 
           printf("请输入序号选择(1.成员编号查询  2.姓名查询  0.退出):");
        scanf("%d",&method); // block ...
        switch(method)
        {
            case 1:
                    //2.2.1通过序号查询 
                    search_serial_num(head);
                    break;
            case 2:
                    //2.2.2通过姓名查询 
                    search_name(head);
                    break; 
            case 0:
                    //2.2.3退出查询 
                    flag_enqry=1;
                    break;         
        }
        
        //2.3检查退出标志 
        if(flag_enqry==1)
        {
            break;
        }
    }    

    return 0;
}

//修改成员信息 
int update(linklist head)
{
    //1.检查是否为野指针 
     if ( head==NULL )
    {
        return -1;
    }
    
    //2.清屏并清空缓存 
    system("cls");
    fflush(stdin);
    
    int num_updt,flag_up=0;
    linklist updt_head=NULL;
    
    //3.输入要修改信息的成员编号 
    printf("请输入要修改的成员编号:");
    scanf("%d",&num_updt);
    updt_head=head->next;
    
    //4.从链表中寻找与该编号相同信息 
    while(updt_head!=NULL)
    {
        //4.1编号与要查询的编号相同则开始修改 
        if(updt_head->serial_num==num_updt)
        {
            printf("修改编号:");
            scanf("%d",&updt_head->serial_num);
            printf("修改姓名:");
            scanf("%s",updt_head->name_mber); 
            printf("修改性别:");
            scanf("%s",updt_head->gender_mber); 
            printf("修改年龄:");
            scanf("%d",&updt_head->age_mber);
            printf("修改职务:");
            scanf("%s",updt_head->posit_mber); 
            
            //4.2找到相同的编号后将标志位赋为1并退出循环 
            flag_up=1;
            break;
        }
        updt_head=updt_head->next;
    }
    
    //5.检查是否找到该编号 
    if(flag_up==1)
    {
        printf("修改成功\n");
    }
    else 
    {
          printf("未找到此成员编号\n");
    }
                 
    system("pause");
    
    return 0;
}

//删除成员信息 
int delete_inf(linklist head)
{
    //1.检查是否为野指针 
     if ( head==NULL )
    {
        return -1;
    }
    
    //2.清屏并清空缓存 
    system("cls");
    fflush(stdin);
    
    linklist fro=NULL,obj=NULL;
    int find_flag=0,dlt_srial_num;
    
    //3.输入要删除的成员编号 
    printf("请输入要删除的成员编号:");
    scanf("%d",&dlt_srial_num);
    fro=obj=head;
    
    //4.从链表中寻找与该编号相同信息 
    while(obj!=NULL)
    {
        //4.1编号相同则将指向它的指针去指向它指向的指针 
        if(obj->serial_num==dlt_srial_num)
        {
            fro->next=obj->next;
            
            //4.1.1找到该编号后将标志位赋为1 
            find_flag=1;
            break;
        }
        
        //4.2编号不同则将这一次变为上一次,然后这一次后移一个 
        fro=obj;
        obj=obj->next; 
    }
    
    //5.检查是否找到该编号 
    if(find_flag==1)
    {
        printf("删除成功!\n");
    }
    else
    {
        printf("未找到删除对象\n");
    }
    
    system("pause"); 
    
    return 0;
}

//录入成员信息 
linklist creat( void ) 
{
    int flag_creat;
    //1.创建头结点、尾结点和成员结点 
    linklist head = NULL, end = NULL, note = NULL;
    head=(linklist)malloc(sizeof(linklist));
    end=head;
    
    //2、开始创建结点 
    while(1)
    {
        //2.1清屏并清空缓存 
        system("cls");
        fflush(stdin);
        
        //2.2开始创建新结点并输入结点信息 
        note=(linklist)malloc(sizeof(linklist));
        printf("请输入成员信息:(成员编号 姓名 性别 年龄 职务)\n");
        printf("成员编号:");
        scanf("%d",&note->serial_num);    
        printf("姓名:");
        scanf("%s",note->name_mber);    
        printf("性别:");
        scanf("%s",note->gender_mber);    
        printf("年龄:");
        scanf("%d",&note->age_mber);    
        printf("职务:");
        scanf("%s",note->posit_mber);    
        end->next =note;
        end=note;
        
        //2.3输入0退出输入其他则继续创建 
        printf("输入下一位成员(1)    退出并保存(0)\n") ;
        scanf("%d",&flag_creat);
        if(flag_creat==0)
        {
            break; 
        }
    }
    
    //3.将尾结点指向的下一个指针赋为NULL 
    end->next =NULL;
    
    return head;
}

//显示全部成员信息 
int show_all(linklist head)
{
    //1.检查是否为野指针 
     if ( head==NULL )
    {
        return -1;
    }
    int flag_show; 
    
    //2.清屏并清空缓存 
    fflush(stdin);
    system("cls");
    
    linklist inst_head=NULL;
    inst_head=head;
    inst_head=inst_head->next;
    
    //3.一直循环到链表末尾 
    while(inst_head!=NULL)
    {
        //3.1打印出成员相关信息 
        printf("编号:%d\t",inst_head->serial_num);
        printf("姓名:%s\t",inst_head->name_mber);
        printf("性别:%s\t",inst_head->gender_mber);
        printf("年龄:%d\t",inst_head->age_mber);
        printf("职务:%s\n",inst_head->posit_mber);
        
        //3.2指向下一位 
        inst_head=inst_head->next;
    }
    
    //4.输入0返回主菜单 
    printf("按0返回主菜单\n");
    while(1)
    {
        scanf("%d",&flag_show);
        if(flag_show==0)
        {
            break;
        }
            
    }    
    
    return 0;
}

//通过成员编号查询成员信息 
int search_serial_num(linklist head)
{
    //1.检查是否为野指针
     if ( head==NULL )
    {
        return -1;
    }
    
    //2.清屏并清空缓存 
    system("cls");
    fflush(stdin);
    
    int num_search,flag_sn=0;
    linklist ser_head=NULL;
    
    //3输入要查询的成员编号 
    printf("请输入要查询的人员编号:");
    scanf("%d",&num_search);
    ser_head=head->next;
    
    //4.寻找该编号 
    while(ser_head!=NULL)
    {
        //4.1编号相同则打印其信息 
        if(ser_head->serial_num==num_search)
        {
            printf("编号:%d\t",ser_head->serial_num);
            printf("姓名:%s\t",ser_head->name_mber);
            printf("性别:%s\t",ser_head->gender_mber);
            printf("年龄:%d\t",ser_head->age_mber);
            printf("职务:%s\n",ser_head->posit_mber);
            
            //4.1.1找到编号后将标志位赋1 
            flag_sn=1;
            break;
        }
        
        //4.2继续向下找 
        ser_head=ser_head->next;
    }
    
    //5.检测是否找到该编号 
    if(flag_sn==0)
    {
        printf("未找到编号为%d的成员",num_search);
    }
                  
    system("pause");
    fflush(stdin);
    
    return 0;
}

//通过名字查询成员信息 
int search_name(linklist head)
{
    //1.检查是否为野指针
    if ( head==NULL )
    {
        return -1;
    }
    
    //2.清屏并清空缓存 
    system("cls");
    fflush(stdin);
    int flag_sn=0;
    char name_search[20];
    linklist ser_head=NULL;
    
    //3输入要查询的成员姓名
    printf("请输入要查询的人员姓名:");
    scanf("%s",name_search);
    ser_head=head->next;
    
    //4.寻找该姓名
    while(ser_head!=NULL)
    {
        //4.1姓名相同则打印其信息 
        if(strcmp(ser_head->name_mber,name_search)==0)
        {
            printf("编号:%d\t",ser_head->serial_num);
            printf("姓名:%s\t",ser_head->name_mber);
            printf("性别:%s\t",ser_head->gender_mber);
            printf("年龄:%d\t",ser_head->age_mber);
            printf("职务:%s\n",ser_head->posit_mber);
            
            //4.1.1找到姓名后将标志位赋1  
            flag_sn=1;
            break;
        }
        
        //4.2继续向下找
        ser_head=ser_head->next;
    }
    
    //5.检测是否找到该姓名
    if(flag_sn==0)
    {
        printf("未找到姓名为%s的成员",name_search);
    }
                 
    system("pause");
    fflush(stdin);
    
    return 0;
}


 

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • SoftwareTeacher 2020-12-29 04:54
    已采纳

    >请问一下为什么我这个程序在DEV C++上总是一运行就出错?感觉没什么错误呀

    具体什么错误信息? 你的输入是什么?  

    点赞 打赏 评论
  • qq_46577501 2020-12-29 10:58

    就是我输入1创建链表后,输入了第一个成员的信息,然后程序就退出了

    点赞 打赏 评论
  • qq_46577501 2020-12-29 16:09

    这程序突然又行了,人傻了

    点赞 打赏 评论
  • qq_46577501 2020-12-30 12:54

    我找到错误了,在给结点分配内存的时候 应该是sizeof()这个结构体的大小 (linklist)malloc(sizeof(struct student_inf));   我之前分配的是linklist 这个指针的大小。

    点赞 打赏 评论

相关推荐