2013-10-18 166 views
2

所以我想實現一個從鏈表中刪除節點的函數。鏈接列表刪除節點

這裏是我的主:

int main(void) 
{ 
    NODE* first = generateNodes(5); 
    NODE* jank = getNode(first, 2); 
    deleteNode(first,2); 
    printf("Length of Node List: %d\n",getNodeListLength(first)); 
    printf("First Node: %d\n",first -> pos); 
    printf("Jank Node: %d\n",jank -> pos); 
    return 0; 
} 

這是我的輸出:

Length of Node List: 2 
First Node: 0 
Jank Node: 2 

輸出應該是(因爲在main()我刪除jank,並降低一個鏈表的大小) :

Length of Node List: 4 
First Node: 0 
Jank Node: NULL 

這是我的全部源代碼:

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

/* NODE STRUCTURE */ 

typedef struct node{ 

    char* thing; 

    int pos; /* Index of node */ 
    struct node* next; /* Pointer to next node */ 

} NODE; 

/* Generates a single node */ 
NODE* generateNode(); 

/* Generates linked nodes and returns the first node */ 
NODE* generateNodes(int num); 

/* Gets a node at a certain index */ 
NODE* getNode(NODE* start, int index); 

/* Returns the length of a list of nodes */ 
size_t getNodeListLength(NODE* start); 

/* Removes a node at a certain index */ 
NODE* deleteNode(NODE* start, int index); 

int main(void) 
{ 
    NODE* first = generateNodes(5); 
    NODE* jank = getNode(first, 2); 
    deleteNode(first,2); 
    printf("Length of Node List: %d\n",getNodeListLength(first)); 
    printf("First Node: %d\n",first -> pos); 
    printf("Other Node: %d\n",jank -> pos); 
    return 0; 
} 

NODE* generateNode() 
{ 
    return (NODE*) malloc(sizeof(NODE)); 
} 

NODE* generateNodes(int num) 
{ 
    NODE* one = generateNode(); 
    NODE* cpy = one; 

    int i; 

    for(i = 0; i < num - 1; i++) 
    { 

     NODE* next = generateNode(); 
     cpy -> next = next; 
     cpy -> pos = i; 
     cpy = next; 

    } 

    cpy -> pos = i; 
    cpy -> next = NULL; 

    return one; 
} 

NODE* getNode(NODE* start, int index) 
{ 
    int i; 
    for(i = 0; i < index; i++) 
    { 
     start = start -> next; 
    } 
    return start; 
} 

size_t getNodeListLength(NODE* start) 
{ 
    size_t i; 
    while(start -> next != NULL) 
    { 
     start = start -> next; 
     i++; 
    } 
    return i - 1; 
} 

NODE* deleteNode(NODE* start, int index) 
{ 
    if(index > 0) 
    { 
     NODE* f = getNode(start,index - 1); 
     NODE* l = getNode(start,index + 1); 
     NODE* d = getNode(start,index); 
     f -> next = l; 
     free(d); 
     return start; 
    } 
    if(index == 0) 
    { 
     NODE* up = start -> next; 
     free(start); 
     return up; 
    } 
    if(index + 1 == getNodeListLength(start)) 
    { 
     NODE* r = getNode(start,index); 
     NODE* c = getNode(start,index - 1); 
     c -> next = NULL; 
     free(r); 
     return start; 
    } 
} 

我哪裏錯了?

+0

有時可能有助於指定哪些部分的代碼你最不舒服的是做什麼,並且密切關注。 – Leonardo

回答

5

我注意到您的size_t igetNodeListLength未初始化爲任何值 - 這可能是意外大小報告的來源。

此外,您從列表中刪除jank,但你的jank指針仍然指向到節點(即使它已經free「d) - 這意味着使用jank正在訪問內存不再是你的了!

+0

謝謝,我發現了我的錯誤 – turnt

0

原來我的錯誤是在這個函數:

size_t getNodeListLength(NODE* start) 
{ 
    size_t i; 
    while(start -> next != NULL) 
    { 
     start = start -> next; 
     i++; 
    } 
    return i - 1; 
} 

應該是:

size_t getNodeListLength(NODE* start) 
{ 
    size_t i = 1; 
    while(start -> next != NULL) 
    { 
     start = start -> next; 
     i++; 
    } 
    return i; 
} 
1

嘗試

//modify this method 
size_t getNodeListLength(NODE* start) 
{ 
    size_t i = 0; 
    while(start != NULL) 
    { 
     start = start -> next; 
     i++; 
    } 
    return i; 
}