我正在努力完成我的编程功课,需要一个链接列表。基本上我们必须创建一个包含某些功能来管理链表的程序。相当标准。我上周尝试过,但是无法得到它。我试图让这个周末工作,并且在我遇到分段错误之前取得了很好的进展。
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: %s\n", pfirst);
printf("Enter a last name: ");
scanf("%s", last);
plast = last;
printf("entered name: %s\n", plast);
printf("Enter the Purdue ID: ");
scanf("%s", ID);
pID = ID;
printf("ID: %s\n", pID);
printf("Enter an age: ");
scanf("%d", &tage);
printf("age: %d\n", tage);
temp->FirstName = strdup(first);
printf("first\n");
temp->LastName = strdup(last);
printf("last\n");
temp->PUID = strdup(ID);
printf("id\n");
temp->age = tage;
printf("age\n");
temp->next = NULL;
printf("next\n");
if (curr == NULL)
{
printf("inside if\n");
head->next = temp; //-------SEGMENTATION FAULT---------------------
printf("line 107\n");
head = curr = temp;
printf("line 109\n");
}
else
{
curr = temp;
}
}
到目前为止我所做的背景: 当我尝试将我的数组分配给我的'temp'节点时,我遇到了分段错误,但是通过使用malloc我解决了这个问题。使用print语句,我已将问题跟踪到指示的行。当我尝试运行代码时,我遇到了分段错误。我在'head'和'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));
这是我认为问题所在的地方,但我一直在寻找和试验几个小时而且没有得到任何结果。我刚刚意识到这是一个很长的帖子。感谢您阅读,我感谢任何正确方向的推动!
答案 0 :(得分:0)
我错了还是您设置head->next = temp;
但从未将head
设置为有效对象?
您必须在开头使用“空”学生初始化head
,否则您只需设置head = temp;
答案 1 :(得分:0)
假设您已在head
函数之外定义了createListNode()
变量,那么问题就出现了:
永远不会为内存分配内存,因为您从未调用malloc()
答案 2 :(得分:0)
您将head
初始化为NULL
。在为其分配有效指针之前,您无法取消引用head
。 head->next = temp;
为您提供了段错误,因为head
是空指针。
因此,您需要查看代码的这一部分:
if (curr == NULL)
{
printf("inside if\n");
head->next = temp; //-------SEGMENTATION FAULT---------------------
printf("line 107\n");
head = curr = temp;
printf("line 109\n");
} else
{
curr = temp;
}
由于您似乎想在列表的末尾插入,我建议这样的内容:
temp->next = NULL;
if (head == NULL) {
curr = head = temp;
} else {
curr->next = temp;
curr = temp;
}
这使curr
始终指向最后一个节点,head
始终指向列表的开头。