節點

2014-01-23 28 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

在這裏,你檢查*頭==溫度,如果是,你自由溫度即*頭因爲他們平等的,你只是證實此事,而且比你說的(*頭)=(*頭) - >下一步;其設置*頭垃圾最有可能

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;