我正在努力完成编程作业,需要帮助处理链表。基本上,我们必须创建一个包含某些功能的程序来管理链表。相当标准。我上周试过了,但就是没能成功。这个周末我正努力让它发挥作用,一直在取得良好的进展,直到遇到分割错误。
struct STUDENT
{
char *FirstName;
char *LastName;
char *PUID;
int age;
struct STUDENT *next;
};
这就是我试图使用的结构。前三个值是char数组,第四个值只是一个数字。在此之后,我尝试全局声明一个起始节点和当前节点。
struct STUDENT *head = NULL;
struct STUDENT *curr = NULL;
接下来,我有了创建节点函数,它接受用户输入并将其放入列表中。
void *createListNode()
{
char first[MAXNAME];
char last[MAXNAME];
char ID[MAXID];
char *pfirst;
char *plast;
char *pID;
int tage;
struct STUDENT *temp = (struct STUDENT *) malloc (sizeof(struct STUDENT));
printf("Enter a first name: ");
scanf("%s", first);
pfirst = first;
printf("entered name: %sn", pfirst);
printf("Enter a last name: ");
scanf("%s", last);
plast = last;
printf("entered name: %sn", plast);
printf("Enter the Purdue ID: ");
scanf("%s", ID);
pID = ID;
printf("ID: %sn", pID);
printf("Enter an age: ");
scanf("%d", &tage);
printf("age: %dn", tage);
temp->FirstName = strdup(first);
printf("firstn");
temp->LastName = strdup(last);
printf("lastn");
temp->PUID = strdup(ID);
printf("idn");
temp->age = tage;
printf("agen");
temp->next = NULL;
printf("nextn");
if (curr == NULL)
{
printf("inside ifn");
head->next = temp; //-------SEGMENTATION FAULT---------------------
printf("line 107n");
head = curr = temp;
printf("line 109n");
}
else
{
curr = temp;
}
}
到目前为止我所做的工作的背景:当我试图将数组分配给"temp"节点时,遇到了分段错误,但通过在上面使用malloc,我解决了这个问题。使用打印语句,我已将问题跟踪到指示行。当我尝试运行代码时,我会遇到分段错误。我在"head"one_answers"curr"节点上尝试了上面相同的malloc代码,但这给了我:
carlton@carlton-Inspiron-N7010:~/CNIT315$ gcc lab5.c
lab5.c:20:64: error: invalid initializer
struct STUDENT head = (struct STUDENT *) malloc (sizeof(struct STUDENT));
这就是我认为问题所在的地方,但我已经搜索和试验了几个小时,但没有取得任何进展。我刚刚意识到这是一个很长的帖子。谢谢你通读,我很感激你朝着正确的方向努力!
将head
初始化为NULL
。在为head
分配有效指针之前,不能取消引用它。head->next = temp;
会给你一个segfault,因为head
是一个空指针。
因此,您需要查看代码的这一部分:
if (curr == NULL)
{
printf("inside ifn");
head->next = temp; //-------SEGMENTATION FAULT---------------------
printf("line 107n");
head = curr = temp;
printf("line 109n");
} else
{
curr = temp;
}
既然你似乎想在列表的末尾插入,我建议这样做:
temp->next = NULL;
if (head == NULL) {
curr = head = temp;
} else {
curr->next = temp;
curr = temp;
}
这使得curr
总是指向最后一个节点,而head
总是指向列表的开头。
我错了吗?还是您设置了head->next = temp;
,但以前从未将head
设置为有效对象?您必须在开始时使用"空"Student初始化head
,或者只需设置head = temp;
假设您已经在createListNode()
函数之外定义了head
变量,那么问题就来了:
内存从未分配给它,因为您从未调用过malloc()