0

我有一个链表,其元素是类型

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] -> Textwith指定的文本

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或者我如何将节点放入列表中存在错误。

4

2 回答 2

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;
}
于 2013-11-03T21:16:33.480 回答
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);
于 2013-11-03T22:09:45.170 回答