数据结构c创建链表之困扰我两星期的segmentation fault

很奇怪的一个问题,太奇怪了!
我记得指针作为函数参数传递的是地址,能够修改那个地址存放的变量。
现在让我来还原这两星期的坎坷。
创建链表的方法:

typedef struct teacher* tList;
int InitList(tList L){
    //malloc 函数返回的是一个地址
    L=(tNode*)malloc(sizeof(tNode));//创建头节点并设置头结点
    L->next=NULL;//首元结点设为空
    return 1;
}

添加信息方法:

int add_teacher_List(tList L){
    tNode *t=(tNode*)malloc(sizeof(tNode));//创建一个节点 
    printf("请输入教职工号:");
    scanf("%s",t->teacher_num);
    printf("请输入教师姓名:");
    scanf("%s",t->teacher_name);
    t->next=L->next;..出现segmentation fault的地方
    L->next=t;//头插
    
    return 1;
}

这两个星期都一直在找add这个方法的错误,就在今天我终于意识到了错误可能是在初始化链表的那个方法中。于是我就设置了两个端点,第一个断点是在main函数中定义头指针的地方,第二个断点设在了初始化头结点的地方。

然后我进行了调试,惊奇的发现我定义头指针时的地址,调用了初始化函数以后,它的地址没有变,也就是说,我的initList方法并没有达到它的预期。

what a fuck!!!我心中的一万头草泥马奔过。两个星期…
现在进行分析一下八:

我传过去的时一个头指针,它是也是一个变量,存放的是一个结构体变量的地址,而我想改变的是头指针的值,而不是头指针指向的结构体变量的值。
解决办法:1.给初始化函数设置返回值 -2.设置指针的指针(这个我有点蒙,所以没有采用这种方案)

解决方案1:

tList InitList(){
    //malloc 函数返回的是一个地址
    tList L;
    L=(tNode*)malloc(sizeof(tNode));//创建头节点并设置头结点
    L->next=NULL;//首元结点设为空
    return L;
}

完整错误代码:

/*
**利用链表实现一个简单的学校教职工信息管理系统:
*(1)教职工信息包括工号、姓名、性别、职称、学位、职务、毕业学校和所学专业等;
*(2)系统的主要功能包括:教职工信息的创建、输出教职工信息、查询教职工信息、增加教职工信息、删除教职工信息。
*
*/
#include<stdio.h>
#include<stdlib.h>

/*
*定义一个“教师”结构体
*/
struct teacher{
    /*
    *数据域
    */
    char teacher_num[6];
    char teacher_name[6];
    char sex;
    char job_title[20];//职称
    char degree[20];//学位
    char duty[20];//职务
    char graduation_school[20];//毕业学校
    char major[15];//专业
    /*
    *指针域
    */
    struct teacher* next;
};
typedef struct teacher* tList;
typedef struct teacher tNode;
/*
*构造一个空链表
*/
tList InitList(){
    //malloc 函数返回的是一个地址
    tList L;
    L=(tNode*)malloc(sizeof(tNode));//创建头节点并设置头结点   断点位置2
    L->next=NULL;//首元结点设为空
    return L;
}
/*
*
*/
int add_teacher_List(tList L){
    tNode *t=(tNode*)malloc(sizeof(tNode));//创建一个节点 
    printf("请输入教职工号:");
    scanf("%s",t->teacher_num);
    printf("请输入教师姓名:");
    scanf("%s",t->teacher_name);
    // t.teacher_num="123";
    // t.teacher_name="song";
    //
    t->next=L->next;
    L->next=t;//头插
    // printf("%s",L->next->teacher_num);
    // printf("%s",t.teacher_name);
    
    return 1;
}
/*
*trouble
*/
void scan(tList L){
    struct teacher *p=L->next;//让p指针指
    //循环遍历链表L,输出数据
    while(p!=NULL){
        printf("教师姓名:%s ",p->teacher_name);
        printf("教师工号:%s ",p->teacher_num);  
        p=p->next;
    }
}
int main(){
    tList teaList;//创建一个头指针即链表 断点位置1
    InitList(teaList);//初始化链表,参数是头指针
    printf("1 增加信息 2删除信息 3查询信息 4查看信息 5退出\n");
    while(1){
        int choice;
        scanf("%d",&choice);
        switch(choice){
            case 1:add_teacher_List(teaList);
                break;
            case 2:
                break;
            case 3:
                break;
            case 4:scan(teaList);
                break;
            case 5:
                return 0;
        }
    }
    
}

解决以后的代码:

/*
**利用链表实现一个简单的学校教职工信息管理系统:
*(1)教职工信息包括工号、姓名、性别、职称、学位、职务、毕业学校和所学专业等;
*(2)系统的主要功能包括:教职工信息的创建、输出教职工信息、查询教职工信息、增加教职工信息、删除教职工信息。
*
*/
#include<stdio.h>
#include<stdlib.h>

/*
*定义一个“教师”结构体
*/
struct teacher{
    /*
    *数据域
    */
    char teacher_num[6];
    char teacher_name[6];
    char sex;
    char job_title[20];//职称
    char degree[20];//学位
    char duty[20];//职务
    char graduation_school[20];//毕业学校
    char major[15];//专业
    /*
    *指针域
    */
    struct teacher* next;
};
typedef struct teacher* tList;
typedef struct teacher tNode;
/*
*构造一个空链表
*/
tList InitList(){
    //malloc 函数返回的是一个地址
    tList L;
    L=(tNode*)malloc(sizeof(tNode));//创建头节点并设置头结点
    L->next=NULL;//首元结点设为空
    return L;
}
/*
*
*/
int add_teacher_List(tList L){
    tNode *t=(tNode*)malloc(sizeof(tNode));//创建一个节点 
    printf("请输入教职工号:");
    scanf("%s",t->teacher_num);
    printf("请输入教师姓名:");
    scanf("%s",t->teacher_name);
    // t.teacher_num="123";
    // t.teacher_name="song";
    //
    t->next=L->next;
    L->next=t;//头插
    // printf("%s",L->next->teacher_num);
    // printf("%s",t.teacher_name);
    
    return 1;
}
/*
*trouble
*/
void scan(tList L){
    struct teacher *p=L->next;//让p指针指
    //循环遍历链表L,输出数据
    while(p!=NULL){
        printf("教师姓名:%s ",p->teacher_name);
        printf("教师工号:%s ",p->teacher_num);  
        p=p->next;
    }
}
int main(){
    tList teaList;//创建一个头指针即链表
    teaList=InitList();//初始化链表,参数是头指针
    if(teaList==NULL){
        printf("error");
    }
    printf("1 增加信息 2删除信息 3查询信息 4查看信息 5退出\n");
    while(1){
        int choice;
        scanf("%d",&choice);
        switch(choice){
            case 1:add_teacher_List(teaList);
                break;
            case 2:
                break;
            case 3:
                break;
            case 4:scan(teaList);
                break;
            case 5:
                return 0;
        }
    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

songyitian4

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值