链接列表,带有指向char数组的指针

时间:2013-11-03 21:05:08

标签: c linked-list

我有一个链接列表,其元素的类型为

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,或者我是如何将节点放入列表中的。

2 个答案:

答案 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);