【问题标题】:Linked List with a pointer to a array of char带有指向 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 是的。然后,按顺序在屏幕上打印它们。

标签: c linked-list


【解决方案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);
猜你喜欢
  • 2018-04-05
  • 2021-01-26
  • 2016-01-27
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
相关资源
最近更新 更多