在0索引处打印链表值时,会出现分段错误。

时间:2018-01-17 21:25:09

标签: c

//我的主要功能

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

1 个答案:

答案 0 :(得分:1)

永远不会插入第一个元素,因为C是按值传递的。因此,您对insert..()函数的局部变量进行了更改。

您应该传递指针的地址或返回已分配内存的地址并将其分配给指针。

然后,有一点需要注意的是 - 你甚至在调用insertSLL之前已经动态分配了内存 - 你不需要它。可以编写insert逻辑,以便它可以为第一个和中间节点执行此操作。