带有指向 char 数组的指针的链表
Posted
技术标签:
【中文标题】带有指向 char 数组的指针的链表【英文标题】:Linked List with a pointer to a array of char 【发布时间】:2013-11-03 21:05:07 【问题描述】:我有一个链表,它的元素是类型
typedef struct List * News;
struct List
char * Text;
News NextN;
;
在主函数中,我声明了一个 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
或者我将节点放入列表中的方式有错误。
【问题讨论】:
我们可以假设News
的 typedef 是 before List
结构定义,对吧?因为正如所写,这不会编译。此外,sizeof(struct News)
?没有struct News
,所以无论如何都不会编译。请以可编译形式发布真实代码。
@WhozCraig,对不起,我编辑了错误。他们不在我的程序中。我的程序超过 200 行,并且是葡萄牙语,我要发布它吗(其他部分工作正常)?
@claptrap 每个PTH[i]对应一个通讯社,节点为新闻,按到达时间组织。
@PauloHenrique 好的,我想我现在明白了,如果以前有文本要添加新节点,您想要阅读文本并将它们设置在向量中 - 所以它是一个链表数组?否则,当您无论如何都可以获取数组中的下一个节点时,在每个节点之间建立链接似乎是多余的。
@claptrap 是的。然后,按顺序在屏幕上打印它们。
【参考方案1】:
也许你追求的是这样的:
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;
【讨论】:
我更正了,这些错误不在我原来的程序中。 不应该是for ( it = PTH[i]->NextN; it->NextN != NULL; it = it->NextN)
吗?【参考方案2】:
假设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
准确分配strlen(msg)+1
位置,然后安全地使用strcpy
。或者你可以使用strdup
,同样在string.h
中声明,它具有这种行为:
PTH[i]->Text = strdup(msg);
【讨论】:
可以将msg
的内容复制到指针PTH[i] -> Text
吗?
@PauloHenrique 您是否为PTH[i]->Text
分配了空间?例如PTH[i]->Text = malloc(...)
不,我只分配给PTH
。
那么在为PTH[i]->Text
分配内存之前不能直接复制。您可以使用strdup
(字符串重复)为您执行此操作。我更新了我的答案,检查一下。很简单:PTH[i]->Text = strdup(msg);
以上是关于带有指向 char 数组的指针的链表的主要内容,如果未能解决你的问题,请参考以下文章