我有一个模拟文本编辑器的程序。它允许用户根据发送的命令,以任何特定的方式向列表中添加文本行。
其中一个功能允许用户在列表中向后移动以查看他们的行(还有另一个功能可以让他们向前移动,但这个功能没有问题)。
还有一些功能可以让用户插入或附加文本。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("%sn", current_line->text);
}
else
printf("Error: Already beginning-of-line.n");
}
这一个很奇怪,当我在文本中间添加文本时,next_line
函数工作正常,但当我运行它返回列表时,它没有显示我添加的内容。
在纸上画(每行一个框,下一行和上一行用一些箭头)
这个比特有问题-当你画的时候应该很清楚。
new_line->prev = current_line->prev;
new_line->next = current_line;
current_line->next = new_line;
current_line = new_line;
如果您试图将换行符附加到文本文件,则应该执行
new_line->prev = current_line;
current_line->next = new_line;
current_line = new_line;