【问题标题】:Array of linked List not working properly in C链表数组在 C 中无法正常工作
【发布时间】:2015-11-07 20:57:22
【问题描述】:

我正在尝试创建一个节点数组,并将 S[] 数组中的值输入到它。但是我一直遇到分段错误。 我的结构如下所示:

typedef struct Node {
int num;
struct Node *next;
}ListNode;

用随机数初始化 S[10] 数组:

    printf("list is:");

    for(i=0;i<10; i++)
    {
            RN= (random()+1);
            S[i]=RN;
            printf("%d  ",S[i]);
    }
    printf("\n");

这是我初始化节点数组的方式:

    ListNode *bucket[Radix];
    for(j=0; j<Radix; j++)
      {
            bucket[i]=(ListNode*)malloc(sizeof(ListNode));
            bucket[i]->next=NULL;
      }

这是我用来从 S[] 读取数组数字到链表数组 bucket[] 中的函数:

     for(y=0;y<(sizeof(S)/sizeof(int));y++) // S is size of a normal array
        {
            digit=bucketNumber(S[y],1);// returns the first digit values
            pointer= bucket[digit];
            number= S[y];
            insert_tail(pointer, number);
        }

我的 insert_tail 函数如下所示:

    ListNode *insert_tail(ListNode *tail, int data)
    // insert and element at tail

    {

    if (tail==NULL)
    { tail=(ListNode *)malloc(sizeof(ListNode));}

    else
    {
        while(tail->next !=NULL)

        tail->next = (ListNode *)malloc(sizeof(ListNode));
        tail= tail->next;
    }

    tail->num= data;
    tail->next=NULL;
    }

这是 bucketNumber 函数:

    int bucketNumber(int num,int digit)
    {
    int x, y;
    y= 10*digit;
    x= num%y;

    if(digit>=2)
    {
      num= num%y;
      x= num/(y/10);
    }
    return (x);

}

我认为分段错误的原因是我的函数没有正确创建数组中的链接。我不确定你,可能还有其他问题!

【问题讨论】:

  • 在调试器中运行你的程序。
  • 为了稍微扩展 kaylum 的观点,使用调试器运行程序通常很简单,这样当出现 seg 错误时,您可以准确地看到它发生在哪一行。鉴于您可能会或可能不会显示所有相关代码(尽管在那里付出了很大的努力),人们可能无法帮助您。如果您需要帮助识别 seg-fault 行,请发表评论并附上您的开发环境详细信息。
  • 我正在研究宙斯。另外,我只是在使用调试器,它指出了 insert_tail 函数的错误。我尝试修复它,但它仍然无法正常工作。
  • 我不熟悉那个 IDE。乍一看,他们不像在他们的网站上发布他们的手册,所以希望你有内置的帮助或提供的有用的 PDF。
  • ...实际上,我想我看到了问题所在。我会尽快发布答案,希望对您有所帮助。

标签: c singly-linked-list


【解决方案1】:

我认为问题出在insert_tail()的这一部分:

else
    {
        while(tail->next !=NULL)

        tail->next = (ListNode *)malloc(sizeof(ListNode));
        tail= tail->next;
    }

    tail->num= data;
    tail->next=NULL;

由于while() 循环后面没有花括号,因此当且仅当tail-&gt;next != NULL

tail->next = (ListNode *)malloc(sizeof(ListNode));

...这与您想要的相反;如果nextNULL,您想为next 分配一个新节点。照原样,next 很可能是NULL,所以tail 被移动到next,但next 没有被分配——它是NULL。在这种情况下,上面的底部两行都会导致分段错误,因为您无法取消引用 NULL 指针,而这正是 -&gt; 正在做的事情。

【讨论】:

  • 哦,我明白了!谢谢你。 :)
猜你喜欢
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
相关资源
最近更新 更多