2014-11-22 3 views
0

Я пишу программу, которая сохраняет строки в связанном списке при распределении памяти как для строки, так и для узла. У меня есть функции ввода и поиска, которые работают отлично, но я не могу заставить свою функцию удаления работать. Кажется, он не удаляет информацию с узла, но я в недоумении за то, что набор для чего и что бесплатно. Любая помощь будет более чем приветствуется, даже если это всего лишь намек.Удаление узла из динамически связанного списка

Моего узел и структура

typedef struct listNode {    //simple linked list structure 
struct listNode *next;     //address to next 
char *data;       //data 
} NODE; 

typedef struct ListStruct { 
    NODE *head;       //head node for iterating 
} LIST; 

Это моя текущая нерабочая версия удаления узла

void deleteNode(LIST *list, char *string){   // passed linked list and string to find 
NODE *prev, *curr, *temp;      //variables init 
//int compare;        // for strcmp if needed 
prev = NULL;        //set prev to null 
curr = list->head;       //set current to the head of the list 
while(curr != NULL){       //while the current node is not null 
if(strcmp(curr->data,string) == 0){   //check for the proper string 
    temp = curr;       //set temp to current node to be deleted 
    temp->data = strcpy(curr->data);  //copy data so free is possible 
    prev->next = temp;      //set the prev to temp 
    free(curr->data);      //free malloc'd data 
    free(curr);       //free malloc'd node 
    curr = temp;       //set curr back to temp 
} 
else{        //if string isn't found at current 
    prev = curr;      //set previous to current 
    curr = curr->next;     //and current to current.next 
} 

} 
}//done 

Я знаю, что ошибка, когда я найти правильную строку, но я не могу ибо жизнь меня выясняет, что не так. Надеюсь скоро услышать от кого-то и поблагодарить вас, как всегда.

+0

Я бы рекомендовал сделать функции более модульными. Это означает, что поиск и сравнение используются как одна функция, которая вернет NODE. Тогда delete просто возьмет в качестве аргумента NODE и освободит его строку и сам NODE. И тем самым сделать его более отлаживаемым, удобным и понятным. – Maor

ответ

3

Вы можете обновить, если блок немного:

if(strcmp(curr->data,string) == 0){   //check for the proper string 
    temp = curr;       //set temp to current node to be deleted 
    if (prev == NULL)       // if the first node is the one to be deleted 
    list->head = curr->next; 
    else 
    prev->next = curr->next;    //set prev next pointer to curr next node 
    curr = curr->next;      //curr updated 
    free(temp->data);      //free malloc'd data 
    free(temp);       //free malloc'd node 

    break; //assume there is only one unique string in the link list 
} 
+0

Одна коррекция: она должна быть 'list-> head' вместо' list-> header'. –

+0

@striving_coder, спасибо! обновлено. – Dere0405

+0

Все еще не работает, но я буду работать с этим и некоторыми печатными изданиями и посмотреть, смогу ли я заставить ее работать. Спасибо вам за помощь. – Chris

0

Следующая должно работать. Мы должны убедиться, что если текущий узел является первым узлом, глава списка должен указывать на следующий. Будет также работать, если несколько узлов имеют те же данные, что и входная строка.

void deleteNode(LIST *list, char *string) 
{           // passed linked list and string to find 
NODE *prev, *curr;       //variables init 
prev = NULL;        //set prev to null 
curr = list->head;       //set current to the head of the list 

while(curr != NULL){      //while the current node is not null 
if(strcmp(curr->data,string) == 0){   //compare the given string with node data 
    temp = curr; 
    if (curr == list->head)     //if first node is to be deleted point 
     list->head = curr->next;   //head of list to next node first then 
    else             
     prev->next =curr->next;   //point prev node's next to current's next 
    curr=curr->next; 

    free(temp->data);      //free malloc'd data 
    free(temp);       //free malloc'd node 
} 
else{         //if string isn't found at current 
    prev = curr;       //set previous to current 
    curr = curr->next;      //and current to current.next 
} 

}//while 
}//void deleteNode 
Смежные вопросы