当标头节点不为空时,链接列表插入结尾

时间:2015-03-18 01:11:55

标签: c

我在链接列表的末尾插入节点时遇到问题。当起始节点不为空并且我不理解问题时,它没有被执行。请帮帮我。该函数被第二次调用,但不会进入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");

2 个答案:

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