Мне кажется, что у вашей функции «Пересечение и печать» есть проблемы.У вас есть:
void traverse_and_printList(head){
struct Node* current = (struct Node*) malloc(sizeof(struct Node));
current = head;
while (head -> next != NULL)
printf("%s", current -> data);
current -> next = current;
}
- Современный GCC предупредит вас о вводящем в заблуждение отступе - строка
current->next = current;
не контролируется циклом while
(C является не Python!). - Проверка
head->current
в цикле неверна;это должен быть current->head
, который вы тестируете. - В качестве точки стиля операторы точек
.
и стрелки ->
очень тесно связаны и не должны иметь пробелов по обе стороны от них. - Функция печати не должна распределять узлы.
Поскольку вы не указали информацию о типе в строке определения функции, head
интерпретируется как int
(с использованием правилпредстандартного C, который C90 должен был разрешить, чтобы иметь шанс быть принятым) - и вы должны компилировать его с помощью компилятора, который не настроен для жалоб на код до C99.Это 21 век;Вы не должны использовать 30-летние обозначения.Выясните, как указать хотя бы C99 и как получать предупреждения.С GCC это было бы в соответствии с -std=c99 -Wall -Werror -Wstrict-prototypes -Wmissing-prototypes
;Я тоже использую -Wextra
, и часто еще больше опций.
void traverse_and_printList(struct Node *head)
{
struct Node *current = head;
while (current->next != NULL)
{
printf("%s", current->data);
current->next = current;
}
}
Особенно при отладке, я бы, вероятно, использовал формат, подобный следующему, окружая данные маркерами (я выбрал [[
и]]
, но выбор за вами), поскольку он может выявить проблемы (например, нежелательные '\r'
на концах строк):
printf("[[%s]]\n", current->data);
Я мог бы также напечатать указатели:
printf("C %p N %p [[%s]]\n", (void *)current, (void *)current->next, current->data);
Вы можете предпочесть более подробные записи (Current
вместо C
; Next
вместо N
), но компактность также имеет свои преимущества.
Предупреждение: исправленный код не был рядом с компилятором.