2015-03-18 3 views
-1

У меня возникла проблема с вставкой узла в конец связанного списка. Он не выполняется, когда начальный узел не является нулевым, и я не понимаю проблему. Пожалуйста, помогите мне здесь. Функция вызывается второй раз, но не идет в блок 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

UPDATE

Я нашел две ошибки, то первый был главой списка не возвращается при добавлении списка. Другой в распределении памяти для строки 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 
+0

Я тоже замечал это, но, видимо, во втором вызове printf не показывает – dvhh

+0

@ user3788124 ответ обновлен. –

0

вопрос также может быть, хотите ли вы tokenlist быть запущен конец списка, или остаются на старте.

Как прямо сейчас, ваш первый звонок: tokenlist = insert_at_end(tokenlist,"TK_BEGIN"); имеет tokenlist быть единственным узлом в списке.

Второй вызов tokenlist = insert_at_end(tokenlist,"TK_BEGIN1"); возвращает «Темп», который происходит также быть «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 
Смежные вопросы