我正在学习c中的链接列表,当我尝试在main()中打印头部的base_pri时,它只是给我一个分段错误。 这是我的代码:
#include<stdlib.h>
typedef struct iorb {
int base_pri;
struct iorb *link;
} IORB;
IORB *head = NULL;
void makeList(IORB *h, int s);
int main(){
makeList(head, 15);
printf("%d\n", head->base_pri);
return 0;
}
void makeList(IORB *h, int s){
while(s > 0){
IORB *temp = (IORB*)malloc(sizeof(IORB));
temp->base_pri = (rand() % 20);
temp->link = h;
h = temp;
s--;
}
}
任何建议都将不胜感激。
答案 0 :(得分:1)
您将head
传递给makeList()
作为按值调用,当控件返回到调用函数head
时,仍然没有修改,即它仍然是{{1}然后当你NULL
即head->base_pri
时,显然它会给出seg。故障。
而是将NULL->base_pri
传递给head
,将makeList()
的地址传递为
head
答案 1 :(得分:0)
嗨,请看下面的错误: -
在下面的代码行中,您传递的是head,其值为NULL makeList(head,15);
现在实际上你称之为: -
makeList(NULL, 15);
这并不意味着什么。哪个错了
如下所示纠正它并传递head的地址而不是值,即NULL地址
makeList(&head, 15);
一旦你纠正了上面的函数调用,就必须改变你的函数签名,如下所示: -
此外,您需要修改您的逻辑,如下所示。在这里,您将实现一个循环链接列表。
void makeList(IORB **h, int s){
while(s > 0){
IORB *temp = (IORB*)malloc(sizeof(IORB));
temp->base_pri = (rand() % 20);
temp->link = NULL;
if(*h == NULL)
h = temp;
else
{
temp->link = *h;
*h = temp;
}
s--;
}
}
同样要打印列表,请在主函数中修改您的代码,如下所示: -
IORB *temp = head;
while(temp != NULL)
{
printf("%d\n", head->base_pri);
temp = temp->link;
}
答案 2 :(得分:0)
我相信你要找的是这个。我假设int s
是您要创建的链接列表的大小。你的makeList(IORB *h, int s)
应该看起来更像这样,(如果你想避免双指针)
在您的主要内容中,您可以创建一个头节点,如:head = (IORB*) malloc(sizeof(IORB));
然后调用makeList(head, 15);
你的makeList
函数看起来像这样:
IORB* temp = h; //set temp to head (since we made sure head is not NULL)
while(s > 0){
temp->link = (IORB*)malloc(sizeof(IORB)); //create it's next node
temp->link->base_pri = (rand() % 20);
temp = temp->link; //remember to move temp pointer to the newly created node
s--;
}