C 带有指向字符数组指针的链表
我有一个链表,它的元素是C 带有指向字符数组指针的链表,c,linked-list,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));
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;
}
其中msg
是长度为2000的字符数组;然后尝试打印由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
,或者我如何将节点放入列表中是否有错误。可能是您想要的:
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;
}
也许你想要的是这样的东西:
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;
}
也许你想要的是这样的东西:
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;
}
也许你想要的是这样的东西:
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;
}
假设msg
是用于接收新数据的缓冲区,则必须小心以下语句:
PTH[i] -> Text = msg;
由于msg
是指向char
的指针,因此赋值不会复制字符序列;相反,它只会使PTH[i]>Text
指向与msg
相同的位置。如果您更改msg
中的内容,这是有问题的-这些更改当然会反映在为其进行分配的每个PTH[i]->文本中,即您添加的每个节点。也许,不完全是你想要的。这就是为什么一次只能处理一个节点的原因。它们都得到相同的文本,因为它们都指向相同的内存位置
您应该使用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 = msg;
由于msg
是指向char
的指针,因此赋值不会复制字符序列;相反,它只会使PTH[i]>Text
指向与msg
相同的位置。如果您更改msg
中的内容,这是有问题的-这些更改当然会反映在为其进行分配的每个PTH[i]->文本中,即您添加的每个节点。也许,不完全是你想要的。这就是为什么一次只能处理一个节点的原因。它们都得到相同的文本,因为它们都指向相同的内存位置
您应该使用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 = msg;
由于msg
是指向char
的指针,因此赋值不会复制字符序列;相反,它只会使PTH[i]>Text
指向与msg
相同的位置。如果您更改msg
中的内容,这是有问题的-这些更改当然会反映在为其进行分配的每个PTH[i]->文本中,即您添加的每个节点。也许,不完全是你想要的。这就是为什么一次只能处理一个节点的原因。它们都得到相同的文本,因为它们都指向相同的内存位置
您应该使用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 = msg;
由于msg
是指向char
的指针,因此赋值不会复制字符序列;相反,它只会使PTH[i]>Text
指向与msg
相同的位置。如果您更改msg
中的内容,这是有问题的-这些更改当然会反映在为其进行分配的每个PTH[i]->文本中,即您添加的每个节点。也许,不完全是你想要的。这就是为什么一次只能处理一个节点的原因。它们都得到相同的文本,因为它们都指向相同的内存位置
您应该使用strcpy
:
strcpy(PTH[i]->Text, msg);
不要忘记包括string.h
这假设PTH[i]>Text
已经分配。如果msg
超过2000个字符,您可能需要使用strncpy
,以避免缓冲区溢出
如果您没有为PTH[i]->Text分配空间,您可以为PTH[i]->Tex精确地分配strlen(msg)+1
位置