我试图创建一个节点数组,并从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);
}
我认为分段错误的原因是我的功能是没有正确地在数组中创建链接。我不确定你是否还有其他错误!
答案 0 :(得分:2)
我认为问题出现在insert_tail()
:
else
{
while(tail->next !=NULL)
tail->next = (ListNode *)malloc(sizeof(ListNode));
tail= tail->next;
}
tail->num= data;
tail->next=NULL;
由于while()
循环后面没有大括号,当且仅当tail->next != NULL
时才会执行以下行:
tail->next = (ListNode *)malloc(sizeof(ListNode));
......这与你想要的相反;如果next
为next
,您希望为NULL
分配新节点。实际上,next
可能是NULL
,因此tail
会向前移动到next
,但next
未被分配 - 它是NULL
。在这种情况下,上面的两行会导致分段错误,因为你不能取消引用NULL
指针,这是->
正在做的事情。