0

我正在编写 ac 程序,我想根据条件将字符串添加到链表中。由于我的代码很长,我制作了一个简化版本,它也显示了我的问题。

我的问题是,在用字符串填充列表后,当我想打印所有元素时,我的“go_thru”函数无法打印列表的最后一个元素。编码:

#include <stdio.h>
#include <stdlib.h>

typedef struct listelement{
    char val[100];
    struct listelement *next;
} LISTELEMENT;

void go_thru( LISTELEMENT *head ){
    LISTELEMENT *temp = head;

    while( temp != NULL ){
        printf("%s ", temp->val);
        temp = temp->next;
    }
}

LISTELEMENT *insert_before( LISTELEMENT *head, char value[] ){
    LISTELEMENT *new_el = ( LISTELEMENT* ) malloc( sizeof( LISTELEMENT ) );

    strcpy( new_el->val, value );
    new_el->next = head;

    return new_el;
}

int main()
{
    LISTELEMENT *list_chi = NULL;
    int i;
    char arr[6][10] = { "cheese",
                        "salt",
                        "icecream",
                        "snow",
                        "summer",
                        "violet"    };
    for( i = 0; i < 6; i++ )
        list_chi = insert_before( list_chi, arr[i] );

    go_thru( list_chi->next );

    return 0;
}

输出包含除 "violet" 之外的所有字符串。我用谷歌搜索了很多,寻找答案,甚至试图在这里搜索问题,但仍然无法解决问题:/

4

1 回答 1

1

当 main 中的 for 循环完成时,您的列表如下所示:

"violet" -> "summer" -> "snow" -> "icecream" -> "salt" -> "cheese" -> [NULL]
/* where -> is a 'next' */

(反向排序是由于使用了insert_before。)考虑到这一点,问题是:

go_thru(list_chi->next); /* ERROR: skips first element! */

为什么?好吧,再次使用该图:

   "violet"    -> "summer"      -> "snow" -> "icecream" -> "salt" -> "cheese" -> [NULL]
/* ^^ list_chi    ^^ list_chi->next */

你可以通过调用go_thru(list_chi)来解决这个问题。除此之外,您的代码看起来不错。

于 2013-05-22T21:45:23.313 回答