2013-11-03 53 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