Печать структуры const deque - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь напечатать двустороннюю очередь (deque), которая также является константой. Моя структура deque проста:

struct node {
  int item;
  struct node *previous;
  struct node *next;
};

struct deque {
  struct node *start;
  struct node *end;
};

Мое мнение таково:

void deque_print(const struct deque *deq) {
  assert(deq);
  if (deq->start->item == deq->end->item) {
    printf("[%d]\n", deq->front->item);
  }
  else {
    printf("{");
    while (1) {
      printf("%d", deq->start->item);
      deq->start = deq->start->next; /// I know this is the problem
      printf(" ");
    }
    printf("}\n");
  }
}

Как отмечено в комментариях к коду, я знаю, какая строка вызывает проблему ( поскольку тип deq является постоянным). Я хотел бы знать, как улучшить это, чтобы это могло печатать. Пожалуйста, также не изменяйте заголовок / объявление функции.

Кроме того, функция печатает все элементы, спереди назад. Он окружен фигурными скобками, и каждый элемент имеет пробел между следующими. Итак, если элементы спереди назад - 1,2,3,4,5, то на выходе должно быть:

{1 2 3 4 5}

Кроме того, не беспокойтесь о пустоте декы, я знаю, как это сделать который. Мне любопытно, в деке есть хотя бы 1 элемент.


В ответ на первый комментарий я попытался:

else {
    printf("{");
    struct llnode *temp = deq->start;
    while (1) {
      printf("%d", temp->item); /// problem
      temp = temp->next;
      if (temp == NULL) break;
      printf(" ");
    }
    printf("}\n");
  }

, и он все еще не работал. Моя функция печати вызывает у меня проблемы

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020
void deque_print(const struct deque *deq)
{
    if (deq == NULL)
    {
        printf("{}");
        return;
    }

    const struct node *node = deq->start;
    const struct node *end = deq->end;

    printf("{");
    while (node)
    {
        if (node == end)
        {
            printf("%d", node->item);
        }
        else
        {
            printf("%d ", node->item);
        }
        node = node->next;
    }
    printf("}");
}
0 голосов
/ 08 апреля 2020

Прежде всего вы должны сохранить длину deque и использовать ее в то время, пока l oop или у вас будет segFault, потому что while(1) повторяется вечно. Во-вторых, я рекомендую вам использовать временный узел в качестве итератора, потому что как только вы напечатаете деку, вы потеряете начальный узел.

void deque_print(const struct deque *deq) {
  int i = 0;
  node *tmp_node = deq->start;
  printf("{");
  while (i < deq->length) { //assuming you have the variable in the struct
    printf("%d", tmp_node->item);
    tmp_node = tmp_node->next;
    printf(" ");
    i++;
  }
  printf("}\n");
  }
}
...