链接列表打印分段错误

时间:2018-04-17 13:54:19

标签: c linked-list singly-linked-list

我正在学习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--;
    }
 }

任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:1)

您将head传递给makeList()作为按值调用,当控件返回到调用函数head时,仍然没有修改,即它仍然是{{1}然后当你NULLhead->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--;    
}