带有指向 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] -&gt; 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]-&gt;NextN; it-&gt;NextN != NULL; it = it-&gt;NextN)吗?【参考方案2】:

假设msg是你用来接收新数据的缓冲区,你必须小心这个语句:

PTH[i] -> Text = msg;

由于msg是指向char的指针,所以赋值不会复制字符序列;相反,它只会使PTH[i]-&gt;Text 指向与msg 相同的位置。如果您更改 msg 中的内容,这会出现问题 - 当然,更改会反映在为其分配的每个 PTH[i]-&gt;Text 中,即您曾经添加的每个节点。可能,不是你想要的。这就是为什么您似乎一次只能处理一个节点的原因。它们都得到相同的文本,因为它们都指向相同的内存位置。

您应该改用strcpy

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

不要忘记包含string.h

这假定PTH[i]-&gt;Text 已经分配。如果 msg 有可能超过 2000 个字符,您可能需要使用 strncpy,以避免缓冲区溢出。

如果您没有为PTH[i]-&gt;Text 分配空间,您可以为PTH[i]-&gt;Text 准确分配strlen(msg)+1 位置,然后安全地使用strcpy。或者你可以使用strdup,同样在string.h 中声明,它具有这种行为:

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

【讨论】:

可以将msg的内容复制到指针PTH[i] -&gt; Text吗? @PauloHenrique 您是否为PTH[i]-&gt;Text 分配了空间?例如PTH[i]-&gt;Text = malloc(...) 不,我只分配给PTH 那么在为PTH[i]-&gt;Text分配内存之前不能直接复制。您可以使用strdup(字符串重复)为您执行此操作。我更新了我的答案,检查一下。很简单:PTH[i]-&gt;Text = strdup(msg);

以上是关于带有指向 char 数组的指针的链表的主要内容,如果未能解决你的问题,请参考以下文章

使用共享指针创建的链表数组

C和C指针小记(十七)-使用结构和指针

[leetcode]138. Copy List with Random Pointer复制带有随机指针的链表

LeetCode-链表

一文讲透链表操作,看完你也能轻松写出正确的链表代码

一文讲透链表操作,看完你也能轻松写出正确的链表代码