2017-04-09 109 views
-1

老实说,当谈到链表时,我不知道自己在做什么。这里的东西导致了分段错误,但我对链接列表知之甚少,不知道它在哪里,更不用说,它们令人困惑。我有代码进行调试,但在发布之前将其取出。代码似乎到了main中的for语句,我得到了错误。用户输入他们想要打印的节点数量以及许多打印的随机数字,其中十个打印在每行上。链接列表出现分段错误

#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; 
} 
+2

程序不能正常工作?非常具体的描述。你给什么输入?除了核心转储之外,你还能得到什么输出?调试器告诉你什么?你添加了多少诊断打印,它告诉你什么?你可以使用断言? –

+0

@JonathanLeffler代码似乎到了main中的for语句,然后我得到错误。用户输入他们想要打印的节点数量,并且用分配给它们的随机数打印许多节点,其中十个打印在一行上。 – mychem97

+0

你用'new = NULL'调用'insertFront'。你应该学习如何使用调试器。 – Siguza

回答

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。所以如果(head == NULL)将始终为真。为什么val参数在不使用时需要makeNode?您可以更新到下面的代码:

    我的建议:

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

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

  2. 你正在做NULL指针解引用(这就是为什么你有段错误)。

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

    这里头和新都是NULL。现在在insertFrontnew->next将segfault。

    的参数insertFront,尚未初始化。你不认为在插入它之前你应该先为脑袋分配内存吗?

    我的建议:(主函数)

    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; 
        } 
    } 
    

    就这么简单。我建议你仔细看看代码,并尝试一步一步地进行调试。

还要确保在将节点插入列表之前,为节点分配内存。去笔和纸的方式,跟踪你的代码一步一步。这就是我用链接列表工作的方式。

+0

不错的分析。你没有问为什么'val'被传递给'makeNode()',但被忽略 - 使用随机数作为值,而不是传递给函数的任何值。你也调用你的'makeNode()',就好像它是一个不带参数的函数一样。 –

+0

是的。你在那里得到了一个有效的点。我想我没有注意到makeNode正在采取val参数:)更新我的代码。 – paratrooper

+0

'printList()'中的'if'测试是一个非常小的优化。你完全可以忽略它,这个函数也可以工作。 –