2015-10-03 4 views
-1

Я продолжаю получать эту ошибку сегментации: ошибка 11, и я не знаю почему.C Ошибка сегментации списка ссылок 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.

Любая помощь будет оценена! Спасибо за ваше время!

EDIT: Как назвать вставки:

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

Является ли 'head'' NULL', когда утверждение выполняется? Была ли она освобождена? – Davislor

ответ

1

Вы, кажется, не проверить, является ли список пуст при сканировании его. Однако, без минимального полного проверяемого примера, который говорит нам, как вы назвали функцию, невозможно точно сказать, что вы сделали.

Update

Теперь, когда у вас есть, что, кажется, это. Вы создаете пустой список и просматриваете его внутри своей функции вставки. Функция поиска разыгрывает нулевой указатель в head, вызывая segfault.

Попробуйте следующее: во-первых, убедитесь, что ваш указатель действителен в каждой из ваших функций, прежде чем что-либо с ним делать. Пустой список не должен выполнять каждый поиск. Во-вторых, для максимальной переносимости вы хотите установить указатель head на NULL (так как указатель NULL не обязательно должен быть все-бит-ноль во всех реализациях).

+0

Я добавлю, как я называю это в OP. – neby