使用链接列表获取分段错误

时间:2017-04-09 01:49:55

标签: c linked-list segmentation-fault

说实话,说到链接列表,我不知道我在做什么。这里的某些东西导致了分段错误错误,但我对链表没有足够的了解,知道它可能在哪里,更不用说,它们令人困惑。我有代码进行调试,但在发布前将其取出。代码似乎转到main中的for语句,我得到了错误。用户输入他们想要打印的节点数量,并且用随机数字打印许多节点,每行打印10个节点。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct node_def
{
    int data;
    struct node_def *next;
};
typedef struct node_def node;

node *makeNode (int val);
node *insertFront(node *head,node *new);
void printList(node *head);

int numNodes = 0;

int main()
{
    srand(time(0));

    int i = 0;

    node *head = NULL;
    node *new = NULL;

    printf("How many nodes? ", numNodes);
    scanf("%d", &numNodes);
    printf("\n");

    head = insertFront(head, new);
    for(i = 0; i < numNodes; ++i)
    {
        makeNode(numNodes);
    /*  printList(head);*/
        /*insertFront(head, new);*/
    }
    printList(head);

    printf("\n");
    return 0;
}
node *makeNode (int val)
{

    node *head = NULL;

    node *new = malloc(sizeof(node));
    new->data = rand() % 10000;
    new->next = NULL;
    if (head == NULL)
        head = new;



    return new;
}
node *insertFront(node *head, node *new)
{

    new->next = head;

    return head;
}
void printList(node *head)
{
    int j = 0;
    for(j = 0; j < numNodes; ++j)
    {
        while (head != NULL)
        {
            printf(" %4d", head->data);
            head = head->next;
        }
        if(j % 10 == 0)
            printf("\n");
    }
    return;
}

1 个答案:

答案 0 :(得分:1)

这个程序有很多问题。基本上,您编写的代码根本没有实现链接列表。

  1. 此功能makenode不正确。

    node *makeNode (int val)
    {
    
        node *head = NULL;
    
        node *new = malloc(sizeof(node));
        new->data = rand() % 10000;
        new->next = NULL;
        if (head == NULL)
            head = new;
    
        return new;
    }
    

    在此代码中,head被初始化为NULL。所以 if(head == NULL)将始终为true。为什么val param在你不使用时需要makeNode?您可以将其更新为以下代码:

    我的建议:

    node *makeNode ()
    {
        node *new = malloc(sizeof(node));
        new->data = rand() % 10000;
        new->next = NULL;
        return new;
    }
    

    你不必在这里检查head = NULL。

  2. 你在main中做了NULL指针解除引用(这就是你遇到段错误的原因)。

    node *head = NULL;
    node *new = NULL;
    
    head = insertFront(head, new);
    

    这里head和new都是NULL。现在在insertFrontnew->next将会出现段错误。

    insertFront head new 的参数尚未初始化。你认为在插入之前你应该首先为头部分配内存吗?

    我的建议:(在主要功能中)

    node *head = makeNode();
    for(i = 0; i < numNodes; ++i)
    {
         node *new = makeNode();
         head = insertFront(head, new);
    }
    
  3. printList函数也是错误的。我建议你看一次并调试它。我不想逐行过去。

    但这是你应该做的事情:

    void printList(node *head)
    {
        if (head == NULL) return;
    
        node *temp = head;
    
        while (temp != NULL)
        {
            printf(" %d\n", temp->data);
            temp = temp->next;
        }
    }
    

    就这么简单。我建议你仔细查看代码并尝试逐步调试它。

  4. 还要确保在列表中插入节点之前,为节点分配内存。按照笔和纸的方式跟踪代码步骤和步骤。这就是我如何使用链接列表。