2012-03-15 4 views
0

У меня есть программа, которая имитирует текстовый редактор. Он позволяет пользователям добавлять строки текста в список в любом конкретном порядке, который они выбирают, в зависимости от команды, которую они отправляют.C Программа - проблемы со связанными списками

Одна из функций позволяет пользователям перемещаться назад по списку, чтобы просмотреть их строки (есть еще один, который позволяет им двигаться вперед, но это не проблема).

Существуют также функции, позволяющие пользователям вставлять или добавлять текст. Вставка содержит строку, помещенную перед текущей строкой, в то время как append устанавливает ее после. Одна из проблем, с которой я сталкиваюсь, - это способ вставки текста в текст.

хитов пользователя i для вставки, помещает текст в через стандартный ввод (stdin), а затем попадает CTRL + D (в среде Linux), чтобы имитировать NULL и вернуться в командный режим. После этого, если вы перейдете по списку, он, кажется, войдет в последнюю строку в верхней части списка, и все последует за ним назад. В какой-то момент я вставил 4 строки текста и сделал бесконечный цикл последних двух строк и разрушил текстовый файл.

Я считаю, что это связано с моей логикой связывания списков, но мне сложно их визуализировать. Вот проблемные функции:

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

Нарисуйте на бумаге (ящик для каждой строки и некоторые стрелки для следующего и пред)

Этот бит имеет проблемы - должно быть достаточно ясно, когда вы рисуете его.

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'. Поэтому я подумал про себя: «Если я изменю 4-ю строку на' current_line = new_line-> next', это уменьшит проблему, когда она будет помещать строки в обратную сторону, так как технически таким образом она вставляет каждую новую строку перед другой. Но потом ... я изменил это, а затем в конце вставки, он указывает на неправильный, поскольку он должен указывать на добавленную добавленную строку И ничего не добавлялось:/ – RedMageKnight

+0

Это значит, что когда я пытаюсь написать Если вы начинаете с i1 <=> C <=> i2, после того, как я запустил вышеуказанные 4 строки, i2 находится в забавном состоянии - ничто не указывает на него, но не только из недавно вставленных строк. – RedMageKnight

+0

, но это prev - старая current_line.(C = current_line) – John3136

0

Если вы пытаетесь добавить символ новой строки в текстовый файл, вы должны делать

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

current_line = new_line; 
+0

Работает строка append - строка вставки - это то, что у меня есть, и она должна добавлять новую строку до позиции текущей строки. – RedMageKnight

+0

Я тебя не понимаю. Что такое current_line? Это как вставка между двумя строками? –

+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; –

Смежные вопросы