C程序 - 链接列表问题

时间:2012-03-15 03:40:11

标签: c linked-list

我有一个模拟文本编辑器的程序。它允许用户以他们选择的任何特定方式向列表添加文本行,具体取决于他们发送的命令。

其中一个功能允许用户在列表中向后移动以查看他们的行(还有一个让他们向前移动,但那个没有问题)。

还有一些功能可以让用户插入或附加文本。 Insert在当前行之前放置了行,而append在之后设置了它。我遇到的一个问题是插入文本的方式。

用户点击i进行插入,通过标准输入(stdin)输入文本,然后点击CTRL + D(在Linux环境中)模拟NULL并返回命令模式。之后,如果你去浏览列表,它似乎进入列表顶部的最后一行,一切都跟着向后。有一次,我插入了4行文本,它在最后2行中进行了无限循环,并破坏了文本文件。

我认为它与链接列表的逻辑有关,但我很难想象它们。以下是有问题的功能:

void insert_line(char *t)
{
    /* Allocate and clear (i.e. set all to 0) */
    struct line *new_line = calloc(1, sizeof(struct line));

    new_line->text = t;

    if(current_line == NULL)
        head = current_line = new_line;
    else
    {
        new_line->prev = current_line->prev;
        new_line->next = current_line;
        current_line->next = new_line;
        current_line = new_line;

        if(current_line->prev == NULL)
            head = current_line;
    }
}

这必须非常糟糕 - 它无限循环文本的方式总是将文本放在后面。这就是我使用insert函数的方式:

else if(command[0] == 'i')
    {
        char * line;
        while((line = get_line(stdin)) != NULL)
            insert_line(line);
     }

get_line一次读取一行文本并返回,直到达到EOF。我知道get_line函数正在运行,因为我的导师为我们编写了它以供使用。

//
// Function: previous_line
// Moves the current_line pointer to the previous node, if any, in the linked-list.
//
void previous_line(void)
{
    if(current_line == NULL)
        printf("Error: No Lines Exist.\n");
    else if(current_line->prev != NULL) {
        current_line = current_line->prev;
        printf("%s\n", current_line->text);
    }
    else
        printf("Error: Already beginning-of-line.\n");
}

这个很奇怪,当我在文本中间附加文本时,next_line函数工作正常,但是当我运行它以返回列表时,它没有显示我添加的内容

2 个答案:

答案 0 :(得分:1)

在纸上画画(每行一个方框,下一个和上一个箭头)

这个位有问题 - 绘制时应该相当清楚。

new_line->prev = current_line->prev;
new_line->next = current_line;
current_line->next = new_line;
current_line = new_line;

答案 1 :(得分:0)

如果您尝试将换行符附加到文本文件中,则应该执行

new_line->prev = current_line;
current_line->next = new_line;

current_line = new_line;