我在链接列表的末尾插入节点时遇到问题。当起始节点不为空并且我不理解问题时,它没有被执行。请帮帮我。该函数被第二次调用,但不会进入else块。
typedef struct token_Info
{
int linenumber;
char* token;
char value[200];
struct token_Info* next;
} token_Info;
token_Info *tokenlist;
token_Info* insert_at_end( token_Info *list,char *name)
{
printf("token identified \t");
token_Info *new_node;
token_Info *temp,*start;
start = list ;
char *tempname ;
tempname = name;
new_node= malloc(sizeof(token_Info));
new_node->token = malloc(sizeof(strlen(tempname)+1));
strcpy(new_node->token,tempname);
new_node->next= NULL;
// printf("%d",strlen(tempname));
if(new_node == NULL){
printf("nFailed to Allocate Memory");
}
if(start==NULL)
{
start=new_node;
return start;
}
else
{
printf("anvesh");
temp = start;
while(temp->next != NULL)
{
temp = temp ->next;
}
temp->next = new_node;
return temp;
}
}
tokenlist = insert_at_end(tokenlist,"TK_BEGIN");
tokenlist = insert_at_end(tokenlist,"TK_BEGIN1");
答案 0 :(得分:1)
<强>更新强>
我发现了两个错误,第一个是在附加列表时没有返回列表的头部。另一个在token
字符串的内存分配中错误地使用了sizeof
。
我重新定位了malloc()
返回值的测试,并添加了第二个。我删除了几个不必要的临时变量,这些变量使代码混乱。我添加了两个函数show_list()
和free_list()
。最后,请记住value
字符串字段仍然未初始化。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct token_Info
{
int linenumber;
char* token;
char value[200];
struct token_Info* next;
} token_Info;
token_Info* insert_at_end( token_Info *list, char *name)
{
token_Info *new_node, *temp;
new_node= malloc(sizeof(token_Info));
if(new_node == NULL){ // repositioned
printf("\nFailed to allocate node memory\n");
exit(1); // added
}
new_node->token = malloc(strlen(name)+1); // removed sizeof
if(new_node->token == NULL){ // added
printf("\nFailed to allocate token memory\n");
exit(1);
}
strcpy(new_node->token, name);
new_node->next= NULL;
if(list==NULL)
return new_node;
// append
temp = list;
while(temp->next != NULL)
temp = temp->next;
temp->next = new_node;
return list; // original head
}
void free_list( token_Info *list)
{
token_Info *temp;
while (list) {
temp = list->next;
free(list->token);
free(list);
list = temp;
}
}
void show_list( token_Info *list)
{
printf ("\nCurrent list:\n");
while (list) {
printf ("%s\n", list->token);
list = list->next;
}
}
int main(int argc, char **argv)
{
token_Info *tokenlist = NULL;
tokenlist = insert_at_end(tokenlist, "TK_BEGIN");
show_list(tokenlist);
tokenlist = insert_at_end(tokenlist, "TK_SECOND");
show_list(tokenlist);
tokenlist = insert_at_end(tokenlist, "TK_FINAL");
show_list(tokenlist);
free_list(tokenlist);
return 0;
}
节目输出:
Current list:
TK_BEGIN
Current list:
TK_BEGIN
TK_SECOND
Current list:
TK_BEGIN
TK_SECOND
TK_FINAL
答案 1 :(得分:0)
问题还可能在于您是希望tokenlist
成为列表的运行结束,还是保持在开头。
截至目前,您的第一个电话:
tokenlist = insert_at_end(tokenlist,"TK_BEGIN");
tokenlist
是列表中唯一的节点。
第二个调用tokenlist = insert_at_end(tokenlist,"TK_BEGIN1");
返回'temp',它恰好也是'TK_BEGIN'节点(即第一个节点)
如果您希望返回值是最后一个元素,则返回new_node
而不是temp
。如果您想保留开始,则返回start
;
所有这一切:
对它的调用不属于任何函数,
我刚刚使用main
中的调用运行它并获得此输出:
int main(void){
tokenlist = insert_at_end(tokenlist,"TK_BEGIN");
tokenlist = insert_at_end(tokenlist,"TK_BEGIN1");
return 0;
}
$> ./a.out
token identified token identified anvesh