2012-03-15 188 views
0

我有一個模擬文本編輯器的程序。它允許用戶根據他們發送的命令以任何特定的方式添加文本到列表中。C程序 - 鏈接列表問題

其中一個功能是讓用戶在列表中向後移動來查看他們的行(還有一個讓他們向前移動但沒有問題的行)。

還有一些功能可以讓用戶插入或附加文本。 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功能工作正常,但是當我運行這個在列表回去,這說明不了什麼的我已經添加了什麼。

回答

1

畫在紙上(每行一個盒子和一些箭頭爲next和prev)

該位的問題 - 當你畫它應該是相當清楚的。

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

如果我正確地畫了出來,它似乎是我需要改變的是,3號線到'current_line-> prev = new_line',這樣'current_line'指向的是接下來的'new_line'。於是我想:「如果我將第四行改成'current_line = new_line-> next',那麼它會緩解將行倒退的問題,因爲從技術上講,它會將每行新行插入到另一行之前。但是,然後......我改變了這個,然後在插入的最後,它指向了錯誤的一個,因爲它應該指向最後添加的行,並且沒有添加任何內容:/ – RedMageKnight 2012-03-15 04:16:31

+0

這意味着當我嘗試寫入列表到一個文件,它只能看到原來的內容,而不是任何新插入的行。 – RedMageKnight 2012-03-15 04:17:55

+0

如果你從i1開始<=> C <=> i2,當我運行上述4行後,i2處於一個有趣的狀態 - 沒有任何指向它,但它是先前的current_line。(C = current_line) – John3136 2012-03-15 04:54:10

0

如果你想添加的新行的文本文件,你應該做

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

current_line = new_line; 
+0

我的追加線正在運行 - 插入線是我在這裏,它應該是在當前線的位置之前添加新線。 – RedMageKnight 2012-03-15 12:36:52

+0

我力求讓你。 current_line商店是什麼?它是否像插入兩行之間? – 2012-03-16 07:16:53

+0

這應該有所幫助:struct line previous = current_line-> prev; previous-> next = new_line; new_line-> prev = previous; new_line-> next = current_line; current_line-> prev = new_line; current_line = new_line; – 2012-03-19 09:32:43