2011-05-21 27 views
1

這是我的代碼。我做了三個函數來添加一個新節點,在另外兩個節點之間插入一個新節點,還有一個刪除,但是我不知道如何刪除第一個節點。我什至不知道。想要創建鏈接列表功能,刪除第一個節點

#include <stdlib.h> 
#include <stdio.h> 

struct Node 
{ 
    int data; 
    struct Node *next; 
}; 
void insert(Node* insertafter, Node* newNode); 
void add(Node* llist,Node* newNode); 
void deleteafter(Node *llist); 
void deletefirts(); 
int main() 
{ 
    struct Node *llist; 
    struct Node *newNode; 
    newNode = (Node*)malloc(sizeof(struct Node)); 
    newNode->data = 13; 
    struct Node *newNode2; 
    newNode2 = (Node*)malloc(sizeof(struct Node)); 
    newNode2->data = 14; 
    llist = (Node*)malloc(sizeof(struct Node)); 
    llist->data = 10; 
    llist->next = (Node*)malloc(sizeof(struct Node)); 
    llist->next->data = 15; 
    llist->next->next = NULL; 
    insert(llist,newNode); 
    add(llist,newNode2); 
    if(llist->next == NULL) 
    printf("shecdoma"); 
    struct Node *cursor = llist; 
    while (cursor != NULL) 
    { 
     printf("%d\n", cursor->data);   
     cursor = cursor->next; 
    } 
    system("pause"); 
    return 0; 
}    
void insert(Node* insertafter, Node *newNode) 
{ 
    newNode->next = insertafter->next; 
    insertafter->next = newNode; 
} 
void add(Node* llist,Node *newNode) 
{ 
    if(llist->next == NULL) 
    { 
    llist->next = newNode; 
    newNode->next = NULL; 
    } 
    else 
    { 
     while(llist->next != NULL)     
     { 
      llist = llist->next; 
     } 
     add(llist,newNode); 
    } 

void deleteafter(Node *llist) 
{ 
if(llist->next != NUll) 
llist->next = llist->next->next; 
} 
void deletefirst(); 
{ 
} 

回答

6

您可以使用類似:

void deletefirst (struct Node **head) { 
    struct Node *tmp = *head;   // save old head for freeing. 
    if (tmp == NULL) return;    // list empty? then do nothing. 
    *head = tmp->next;     // advance head to second node. 
    free (tmp);       // free old head. 
} 

您在指針傳遞給頭,讓你可以改變它。刪除除第一個節點以外的節點不需要此操作,但刪除第一個節點。

你建立了一個臨時指針,讓你釋放它,然後你改變頭指向它的下一個元素。然後你釋放舊頭並返回。

2
void deleteFirst(Node** list) 
{ 
    Node* temp = *list; 
    if (*list != NULL) 
    { 
    *list = (*list)->next; 
    free(temp); 
    } 
}