Создание связанного списка - Вывод мусора? - PullRequest
1 голос
/ 26 ноября 2011

Не получается понять, почему я получаю вывод мусора из этой структуры связанного списка при печати содержимого.

Моя цель - добавить в список что-нибудь, строку, символ за символом, и она должна распечатываться в обратном порядке. Причина, по которой я использую дополнительный Struct for Head + Tail, заключается в том, что я могу затем распечатать строки заказа, введенные в обратном порядке.

typedef struct List {
 char c;
 struct List *next;
}List;

typedef struct  {
 List *head;
 List *tail;
}FullList;

List* InsertList(int hd, List* t1) {
 List *t = (List*)calloc(1,sizeof(List));
 t->c = hd; 
 t->next = t1;
return t;
}


FullList addToStart(FullList c, char element) {
 if (c.head == NULL) {
    c.head = c.tail = InsertList(element, NULL);
 }else {
    c.head = InsertList(element, c.head);
 }
return c;
}

int main(void) {
 FullList InOrder;
 FullList Reverse;
 InOrder.head = NULL;
 Reverse.head = NULL;
 char c;

  while ((c = getchar() != '.')) {
    InOrder = addToStart(InOrder, c);
 }
  while (InOrder.head->next != NULL) {
    printf("%c", (InOrder.head->c));
    InOrder.head = InOrder.head->next;

}     
return 0;           
}

1 Ответ

5 голосов
/ 26 ноября 2011

Проблема здесь:

while ((c = getchar() != '.')) 

должно быть:

while ((c = getchar()) != '.') 

потому что != имеет более высокий приоритет , чем =.

Что вы делаете в while ((c = getchar() != '.')):

  1. Вы читаете символ, вызывая getchar.
  2. Сравните, является ли символ прочитанным периодом или нет.
  3. Назначьте результат сравнения на c, чтобы ваш c был либо 0, либо 1. И когда вы печатаете символ со значением 1, вы видите этот странно выглядящий символ.

Также обратите внимание, что тип возвращаемого значения getchar равен int, поэтому вам необходимо объявить c как int.

Также

while (InOrder.head->next != NULL) 

должно быть:

while (InOrder.head != NULL)

иначе вы преждевременно завершите цикл без обработки последнего узла.

...