C链表清单分段错误11

时间:2015-10-03 04:39:36

标签: c linked-list void-pointers singly-linked-list

我一直收到此分段错误:11错误,我不知道为什么。

我的代码:

typedef struct Node* NodePtr;
struct Node
{
    NodePtr next;
    void *val;
};

struct List
{
    NodePtr head;
};
typedef struct List* ListPtr;

int compare(void *one, void *two)
{
    if(*(int*)one < *(int*)two)
        return -1;
    else if(*(int*)one > *(int*)two)
        return 1;

    return 0;
}

ListPtr create()
{
    ListPtr blah = malloc(sizeof(struct List));
    memset(blah, 0, sizeof(struct List));

    return blah;
}

NodePtr scan(NodePtr head, void *obj)
{
    NodePtr previous, current;

    previous = head;
    current = head->next;      // Segmentation fault here!!

    while(current != NULL && (compare(curry->val, obj) == -1))
    {
        previous = current;
        current = current->next;
    }

    return previous;
}

int insert(ListPtr llist, void *obj)
{
    NodePtr newobj = malloc(sizeof(struct Node));
    NodePtr prevNode, nextNode;

    prevNode = search(llist->head, obj);
    nextNode = prevNode->next;

    if((nextNode == NULL) || (compare(nextNode->val, obj) != 0))
    {
        prevNode->next = newobj;
        newobj->next = nextNode;

        return 1;
    }
    else
    {
        free(newobj);
    }

    return 0;
}

我认为head未分配,因此我在malloc创建了blah->head,但仍然没有运气。

我认为在调试之后错误就在这里:current = head->next

任何帮助将不胜感激!谢谢你的时间!

编辑:我如何调用insert:

int main(int argc, char *argv[])
{
    ListPtr list = create();

    int x = 2;
    int *p = &x;

    while(*p != 0)
    {
        printf("\nEnter a number: ");
        scanf("%d", p);

        if(*p != 0)
            insert(list, p);
    }

    return 0;
}

1 个答案:

答案 0 :(得分:1)

扫描时,您似乎无法检查列表是否为空。但是,如果没有告诉我们您如何调用该函数的最小完全可验证示例,则无法确定您所执行的操作。

更新

现在你有了,似乎就是这样。您创建一个空列表并在插入函数中搜索它。搜索功能取消引用head中的归零指针,导致段错误。

请尝试以下操作:首先,在对其执行任何操作之前,检查指针在每个函数中是否有效。每个搜索都会失败一个空列表。其次,为了获得最大的可移植性,您希望将head指针设置为NULL(因为NULL指针在所有实现中都不一定是全位 - 零。)