清理链表逻辑

时间:2014-11-18 13:18:44

标签: c linked-list code-cleanup

所以我一直在编写一个程序,从命令行获取任何输入,直到'。'字符,然后打印出输入但线条反转。所以:

  

您好

     

世界。

变为

  

世界

     

您好

该问题应该用于练习链表,因此我使用链表存储每行输入(字符串),然后使用另一个列表来存储行。所以我想拥有它,以便将一个传入的字符放在字符串列表的末尾,直到' \ n'收到,然后这一行放在行列表的开头。我目前的代码工作正常,但在我看来逻辑非常混乱。但是,我无法提出其他正常运作的内容。

    do {
        string->first = string->last = NULL ; // 'empty' the list
        while ((c = getchar ()) != '.') {
            addToEndOfString (string, c) ; // puts a character at the end of a list of characters
            if (c == '\n') break ;
        }
        addToStartOfList(l, str) ; // puts a pointer to a list of characters at the start of a list of pointers
    } while (c != '.');

    // print the list

有了这个,我也被迫打印' \ n'当我打印出每一行时,因为它们没有存储。

是否有更好(更清洁)的方法做同样的事情?

编辑:addToEndOFString

int addToEndOfString ( String *str , char c )
{       
    Character *a = malloc(sizeof(Character)) ;
    a->val = c ;
    a->next = NULL ;

    if (str->first == NULL) {
        str->first = a ;
        str->last = a ;
    } else {
        str->last->next = a ;
        str->last = a ;
    }
    return 0 ;
}

1 个答案:

答案 0 :(得分:0)

使用fgets

#define MAX_BUF_SIZE 1024
char temp[MAX_BUF_SIZE] = "";
do {

     fgets(temp, MAX_BUF_SIZE, stdin);
     addToStartOfList(l, temp) ;

} while(strlen(temp) && (temp[strlen(temp) - 2] != '.'));