2016-12-20 3 views
1

Следующий код приводит к ошибке сегментации, если insertBefore вызывается после insertAfter или если insertAfter вызывается несколько раз.Почему этот связанный список Seg Fault?

void insertBefore(list *l, void *p){ 
    node* newNode = malloc(sizeof(node) + l->SizeOfData); 
    memcpy(newNode->item, p, l->SizeofData); 
    l->curent->previous->next = newNode; 
    l->current->previous = newNode; 
} 
void insertAfter(list *l, void *p){ 
    node* newNode = malloc(sizeof(node) + l->SizeOfData); 
    memcpy(newNode->item, p, l->SizeofData); 
    l->curent->next->previous = newNode; 
    l->current->previous->next = newNode; 
    l->current = newNode; 
} 

списки используются являются:

struct node { 
    struct node *previous; 
    struct node *next; 
    char item[]; 
}; 

typedef struct node node; 

struct list { 
    node *first; 
    node *current; 
    node *last; 
    int SizeOfData; 
}; 

list *newList(int b) { 
    list *list = malloc(sizeof(list)); 
    node *sentnode = malloc(sizeof(node)); 
    sentnode->previous = sentnode; 
    sentnode->next = sentnode; 
    list->first = sentnode; 
    list->current = sentnode; 
    list->last = sentnode; 
    list->SizeOfData = b; 
    return list; 
} 
+1

Где указывает отладчик, вызывающий ошибку seg? –

+0

Я использую компилятор C, поэтому он не указывает, где. Сожалею. –

+0

Какие ОС вы используете, и можете ли вы предоставить минимальный рабочий пример, который показывает проблему? Неправильный отладчик mans должен просто вставлять выражения 'printf' между строками, пока не увидите, какой из них не печатается –

ответ

2

Вы забыли установить previous и next указатели newNode. Существует также еще одна ошибка в insertAfter (измененная строка).

void insertBefore(list *l, void *p){ 
    node* newNode = malloc(sizeof(node) + l->SizeOfData); 
    memcpy(newNode->item, p, l->SizeofData); 
    newNode->previous = l->current->previous; // Added line 
    newNode->next = l->current;     // Added line 
    l->current->previous->next = newNode; 
    l->current->previous = newNode; 
} 

void insertAfter(list *l, void *p){ 
    node* newNode = malloc(sizeof(node) + l->SizeOfData); 
    memcpy(newNode->item, p, l->SizeofData); 
    newNode->previous = l->current;  // Added line 
    newNode->next = l->current->next;  // Added line 
    l->current->next->previous = newNode; 
    l->current->next = newNode;   // Changed line 
    l->current = newNode; 
}