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