2013-11-03 75 views
0

的陣列我有一個鏈表,其元素類型鏈表的指針焦炭

typedef struct List * News; 
struct List 
    { 
     char * Text; 
     News NextN; 
    }; 

在主函數中的我聲明類型新聞的數組如下

News PTH[50]; 
for (i = 0; i < 50; i++) 
    { 
     PTH[i] = (News) malloc(sizeof(struct List)); 
     PTH[i] -> Text = NULL; 
     PTH[i] -> NextN = NULL; 
    } 

我在列表的開頭添加新節點與

if (PTH[i] -> Text == NULL) 
    PTH[i] -> Text = msg; 
else 
    { 
     t -> Text = msg; 
     t -> NextN = PTH[i]; 
     PTH[i] = t; 
    } 

哪裏msg是一個長度爲2000字符的陣列;並且,然後試圖打印由PTH[i] -> Text apointed文本與

p = PTH[i]; 
if (p -> Text != NULL) 
    { 
     printf("%s", p -> Text); 
     p = p -> NextN; 
    } 
while (p != NULL) 
    { 
     printf("%s", p -> Text); 
     p = p -> NextN; 
    } 
} 

這種算法只添加一個節點。錯誤是我如何定義PTH,或者在如何將節點放入列表中時出現錯誤。

+1

我們可以假設爲typedef的'News'是* *前的'List'結構定義,對不對?因爲按照書面,這不會編譯。此外,'sizeof(struct News)'?沒有'struct News',所以不會編譯。請以* compilable *形式發佈* real *代碼。 – WhozCraig

+0

@WhozCraig,對不起,我編輯錯誤。他們不在我的計劃中。我的程序長200多行,用葡萄牙語,我可以發佈(其他部分工作正常)? –

+0

@claptrap每個PTH [i]對應一個通訊社,節點是新聞,按到達時間組織。 –

回答

1

假設msg是你用來接收新數據的緩衝區,你必須要小心這樣的說法:

PTH[i] -> Text = msg; 

由於msg是指向char的指針,因此分配不會複製字符序列;相反,它只會使PTH[i]->Text指向與msg相同的位置。如果您更改了msg中的內容,則這會產生問題 - 當然,這些更改反映在爲其進行分配的每個PTH[i]->Text(即您添加的每個節點)中。可能,不是你想要的。這就是爲什麼你一次只能處理一個節點的原因。他們都獲得相同的文本,因爲他們都指向相同的內存位置。

您應該使用strcpy代替:

strcpy(PTH[i]->Text, msg); 

不要忘了包括string.h

這裏假定PTH[i]->Text已被分配。如果有可能msg超過2000個字符,您可能需要使用strncpy,以避免緩衝區溢出。

如果您沒有爲PTH[i]->Text分配空間,則可以準確地爲分配PTH[i]->Text的位置,然後安全地使用strcpy。或者你可以使用strdup,在string.h也宣稱,這恰好有這種行爲:

PTH[i]->Text = strdup(msg); 
+0

我可以將'msg'的內容複製到'PTH [i] - > Text'指針嗎? –

+0

@PauloHenrique你爲'PTH [i] - > Text'分配了空間嗎?例如'PTH [i] - > Text = malloc(...)' –

+0

不,我沒有爲'PTH'分配。 –

2

也許是這樣的你是後:

if (PTH[i]->Text == NULL) 
{ 
    PTH[i]->Text = msg; 
} 
else // first create node, then append by first finding the last node 
{ 
    News it = NULL; 
    News t = malloc(sizeof(struct List)); 
    t->Text = msg; 
    t->NextN = NULL; 

    for (it = PTH[i]->NextN; it != NULL; it = it->NextN) 
    { 
    ; 
    } 
    it->NextN = t; 
} 
+0

我糾正了這些錯誤不在我的原始程序中。 –

+0

不應該是'for(it = PTH [i] - > NextN; it-> NextN!= NULL; it = it-> NextN)'? – Cookyt