我有一个链接列表,其元素的类型为
typedef struct List * News;
struct List
{
char * Text;
News NextN;
};
在main函数中,我声明了一个类型为News的数组,如下所示
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的char数组;然后尝试打印PTH[i] -> Text
带
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
,或者我是如何将节点放入列表中的。
答案 0 :(得分: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;
}
答案 1 :(得分: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
。如果strncpy
有可能超过2000个字符,您可能希望使用msg
,以避免缓冲区溢出。
如果您没有为PTH[i]->Text
分配空间,则可以为strlen(msg)+1
准确分配PTH[i]->Text
个职位,然后安全地使用strcpy
。或者您可以使用strdup
,也在string.h
中声明,它具有以下行为:
PTH[i]->Text = strdup(msg);