我试图插入到链表中但是在调用display()方法时我得不到正确的输出。将数据插入链表时一切都很好。
insert()方法中的printf语句打印:
a int
b int
c int
但是当调用display()方法时,它会打印:
c
c
c
结构的数据类型成员根本没有打印。并且,我认为identifierName成员每次都会被覆盖。下面我的代码片段:
struct symbol
{
char* identifierName;
char* datatype;
struct symbol* next;
};
void insert(struct symbol** headRef,char* identifier,char* type)
{
struct symbol* newnode = (struct symbol*) malloc(sizeof(struct symbol));
newnode->identifierName = identifier;
newnode->datatype = type;
newnode->next = (*headRef);
(*headRef) = newnode;
printf("%s %s\n",newnode->identifierName,newnode->datatype); //debugging
}
void display(struct symbol* node)
{
while(node!=NULL)
{
printf("%s %s\n",node->identifierName,node->datatype);
node = node->next;
}
}
答案 0 :(得分:0)
似乎你需要复制作为函数参数传递的字符串。
按照以下方式更改功能
#include <string.h>
//...
void insert(struct symbol** headRef,char* identifier,char* type)
{
struct symbol* newnode = (struct symbol*) malloc(sizeof(struct symbol));
if ( newnode )
{
newnode->identifierName = malloc( strlen( identifier ) + 1 );
strcpy( newnode->identifierName, identifier );
newnode->datatype = malloc( strlen( type ) + 1 );
strcpy( newnode->datatype, type );
newnode->next = *headRef;
*headRef = newnode;
printf("%s %s\n",newnode->identifierName,newnode->datatype); //debugging
}
}
考虑到函数期望参数标识符和类型是字符串的第一个字符的突出显示。
例如,如果参数标识符是指向单个字符的指针,则代替
newnode->identifierName = malloc( strlen( identifier ) + 1 );
strcpy( newnode->identifierName, identifier );
你必须写
newnode->identifierName = malloc( sizeof( char ) );
*newnode->identifierName = *identifier;
当删除节点时,也不要忘记释放这些指针指向的内存。
答案 1 :(得分:-2)
替换这两行
newnode->next = (*headRef);
(*headRef) = newnode;
与
newnode->next = headRef->next;
headRef = newnode;