2013-03-24 50 views
0

我寫了一個包含鏈接列表的簡單程序。當我嘗試在創建的函數中顯示鏈表時,它工作正常;但是,當我返回到主並嘗試顯示它時,它不能正常工作。鏈接列表的頭部在傳遞給函數時發生變化

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

#define LEN 20 
struct Node { 
char word[LEN]; 
int count; 
Node * next; 
}; 

Node* build_linked_list (char array[][LEN], int N); 
Node* make_ordered_copy (Node * head); 
void print_list(Node * head); 


int main() 
{ 
#define NUMBER 10 
char array[NUMBER][LEN]; // array which the words will be recorded 
int N=6; 
for(int a=0; a<N; ++a) strcpy(array[a], "test"); 
print_list(build_linked_list(array, N)); 
getchar(); 
return 0; 
} 

Node* build_linked_list (char array[][LEN], int N) 
{ 
    Node ndArray[N]; 
    Node *head, *newnode; 

    head = &ndArray[0]; 
    strcpy(head->word, array[0]); // writing the first element to the head 
    head->count = 0; 
    head->next = NULL; 

    for(int a=1; a<N; ++a) // writing the elements in a linked list 
    { 
    newnode = &ndArray[a]; 
    strcpy(newnode->word, array[a]); 
    newnode->count = 0; 
    newnode->next = head; // first location now becomes second location 
    head = newnode; 
    } 

    print_list(head); 
    printf("Previous values were shown in build_linked_list\n"); 

    return head; 
} 

void print_list(Node* head) 
{ 
Node* traverse; 
traverse = head; 

while(traverse) // while traverse is not NULL 
{ 
    printf("\"%s\" with the frequency of %d\n", traverse->word, traverse->count); 
    traverse = traverse->next; 
} 


return; 
} 

當從主叫print_list功能調試,「traverse->字」表示在第一次正確的值,但它不打印正確,然後將其更改爲一些其他值。

回答

0

ndArray的元素僅在build_linked_list範圍內有效。一旦程序存在該函數,對這些元素的任何訪問都會產生未定義的行爲。您正在使用這些元素構建鏈接列表。相反,您需要爲堆中鏈接列表的節點分配內存,或者需要將ndArray變量移動到文件範圍,以便在方法的生存期內存在。

+0

好的,非常感謝。當我第一次寫這部分時,我曾經想過,但不知怎的,我已經確信自己會沒事的:D。現在它工作正常,再次感謝。 – bgun 2013-03-24 21:25:48

0

build_linked_list您聲明

Node ndArray[N]; 

這是你該函數內填充節點。但是當執行結束時,函數ndArray的塊被解除分配,因此指針返回指向先前分配給ndArray的內存,但現在不再被該數組佔用。

鏈表的通常實現是使用堆和動態內存分配完成的。 當構建節點數組,你應該寫:

Node* ndArray = new ndArray[N]; 

但在這一點上,我higly建議你閱讀有關垃圾收集以及如何正確地管理動態內存,因爲這是已經討論過了一個全新的話題並在這裏StackOverflow。

對於這個答案我就預料到你,用newnew[]分配(爲mallocfree看到C基準)時,你應該也有deletedelete[]分別刪除。在這種情況下,當你與一個鏈表或ndArray做了你應該寫:

delete[] ndArray; 

釋放內存。否則你會有內存泄漏。

相關問題