2014-01-23 2 views
0

Большая часть кода работает, но когда я пытаюсь удалить последний элемент своего списка, и я его печатаю, я вижу на его месте некоторые данные мусора, что я здесь делаю неправильно? Может ли кто-нибудь указать на мою ошибку?Удаление узла в связанном списке

void DeleteClient2(struct client *temp,struct client **head) 
{ struct client *prev=*head; 
    struct client *current = *head; 
    struct item *currentitem = (*head)->item_data,*save; 
    if(temp== *head) 
    { 
     while(currentitem != NULL) 
     { 
      save = currentitem; 
      currentitem = currentitem ->next; 
      free(save); 
     } 
     free(temp); 
     temp->item_data = NULL; 
     (*head) = (*head)->next; 
    } 
    else 
    if(temp->next == NULL) 
    { 
     while(currentitem != NULL) 
     { 
      save = currentitem; 
      currentitem = currentitem ->next; 
      free(save); 
     } 
     temp->item_data = NULL; 
     free(temp); 
    } 
    else 
    if(temp != *head && temp->next != NULL) 
    { 
     while(prev->next != temp) 
     { 
      prev=prev->next; 
     } 
     prev->next = temp->next; 
     while(currentitem != NULL) 
     { 
      save = currentitem; 
      currentitem = currentitem ->next; 
      free(save); 
     } 
     temp->item_data = NULL; 
     free(temp); 
     temp=temp->next; 
    } 
} 
+1

первый отступа ваш код правильно. –

ответ

0
void DeleteClient2(struct client *temp,struct client **head) 
{ struct client *prev=*head; 
    struct client *current = *head; 
    struct item *currentitem = (*head)->item_data,*save; 
    if(temp== *head) \\ if head is the node to be deleted 
    { 
     while(currentitem != NULL) 
     { 
      save = currentitem; 
      *head = currentitem->next; 
      \\ currentitem = currentitem ->next; 
      free(save); 
     } 

    } 
    else 
    if(temp->next == NULL) \\ if the node to be deleted is last node then 
    { 
    while(currentitem->next != NULL) 
     { 
      *prev = currentitem; 
      currentitem = currentitem ->next; 

     } 
     prev->next = NULL; 
     free(currentitem); 
} 
else 
if(temp != *head && temp->next != NULL)\\ node to be deleted is between head and last node 
{while(prev->next != temp) 
{ currentitem = *prev; 
    prev=prev->next; 
} 
currentitem->next = temp->next; 
free(temp); 
\\while(currentitem != NULL) 
    \\ { 
    \\  save = currentitem; 
    \\  currentitem = currentitem ->next; 
    \\\  free(save); 
    \\ } 
     \\ temp->item_data = NULL; 
    \\ free(temp); 
    \\ temp=temp->next; 
} 
} 
+0

может быть ошибка в моем коде, но вы можете попробовать эту идею (изменения, которые я сделал – Ashish

2

Код:

free(temp); 
    temp=temp->next; // temp->next is invalid 

Неопределено поведение, как только вы освободить узел, вы не можете получить доступ к этому, это является незаконным.

+0

Чем я должен связывать предыдущий узел и следующий узел? – user3209183

+0

@ user3209183 сохранить Сохранить предыдущий адрес –

0

Здесь вы проверяете, что * head == temp, и если да, вы освобождаете temp i.e * head, потому что они равны, вы просто проверили это, и чем вы говорите (* head) = (* head) -> next; которые устанавливают * голову в мусор, скорее всего

if(temp== *head) 
{ 
    while(currentitem != NULL) 
    { 
     save = currentitem; 
     currentitem = currentitem ->next; 
     free(save); 
    } 
    free(temp); 
    temp->item_data = NULL; 
    (*head) = (*head)->next; 
} 

То же бардак здесь

temp->item_data = NULL; 
    free(temp); 
    temp=temp->next; 
Смежные вопросы