//我的主要功能
int main (void) {
srandom(1);
SLL *p = newSLL(displayINTEGER,freeINTEGER);
insertSLL(p,0,newINTEGER(3));
insertSLL(p,sizeSLL(p),newINTEGER(2));
insertSLL(p,1,newINTEGER(22));
int x = getINTEGER((INTEGER *) getSLL(p,2)); //Works fine it prints 2
printf ("x is : %d\n",x);
x = getINTEGER((INTEGER *) getSLL(p,1)); //Works fine it prints 22
printf ("x is : %d\n",x);
x = getINTEGER((INTEGER *) getSLL(p,0)); //This is where i get error (Segmentation Fault)
printf ("x is : %d\n",x);
//插入函数@param SLL,index,value
void insertSLL(SLL *items,int index,void *value)
{
SLL *newSLL = malloc(sizeof(SLL));
newSLL->value = value;
if (items == NULL)
{
}
else if (index == 0)
{
newSLL->tail = items;
items = newSLL;
}
else
{
struct sll *current = items;
for(int i=0; i<index-1; i++)
{
current = current -> tail;
}
newSLL -> tail = current -> tail;
current -> tail = newSLL;
}
}
// getSLL @param SLL和index并返回指向该值的指针。 //这个函数适用于索引&gt; 0但在index == 0
时给出分段错误 void *getSLL(SLL *items,int index)
{
int count = 0;
while (items != NULL)
{
if (count == index)
{
return items->value;
}
count++;
items = items->tail;
}
return NULL;
}
答案 0 :(得分:1)
永远不会插入第一个元素,因为C是按值传递的。因此,您对insert..()
函数的局部变量进行了更改。
您应该传递指针的地址或返回已分配内存的地址并将其分配给指针。
然后,有一点需要注意的是 - 你甚至在调用insertSLL
之前已经动态分配了内存 - 你不需要它。可以编写insert
逻辑,以便它可以为第一个和中间节点执行此操作。