Динамический список - C (СИ)
Формулировка задачи:
Здравствуйте! Есть код (задание в заголовке)
Путем нехитрых экспериментов, было установлено, что
#include <stdio.h> #include <stdlib.h> #define DB printf("%d\n", __LINE__); typedef struct Node { int value; struct Node *next; } node; typedef struct List { node *first; node *last; } list; void init_list(list *l) // очищает список { l->first = NULL; l->last = NULL; } void push_back(list *l, int val) // вставляет элемент в конец { node new = {val, NULL}; if(l->first == NULL) // если список пустой { l->first = &new; l->last = &new; return; } l->last->next = &new; l->last = &new; } int list_size(list l) { node *buff = l.first; int size = 1; while(buff != l.last) { buff = buff->next; size++; } return size; } void print_all(list l) { node *buff = l.first; printf("start = %d end = %d \n", l.first, l.last); while(buff != l.last) { printf("'%d' ", buff->value); buff = buff->next; } printf("\n"); } int main() { list a; init_list(&a); push_back(&a, 2); push_back(&a, 3); push_back(&a, 4); push_back(&a, 5); printf("%d\n", list_size(a)); print_all(a); return 0; }
a.first
всегда равенa.last
, при том, что в ф-цииpush_back
, вроде сказано, что равны они только в двух случаях - когда список пустой или когда там только один элемент. Из всего выше сказанного следует, что длинна всегда равна1
, аprint_all
заканчивает свое выполнение сразу. Помогите пожалуйста разобраться, как это исправить.Решение задачи: «Динамический список»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #define DB printf("%d\n", __LINE__); typedef struct Node { int value; struct Node* next; } node; typedef struct List { node* first; node* last; } list; void push_back(list* l, int val) { // вставляет элемент в конец node* new = malloc(sizeof(node)); new->value = val; new->next = NULL; if (l->first == NULL) { // если список пустой l->first = l->last = new; } else { l->last->next = new; l->last = new; } } int list_size(const list l) { const node* buff = l.first; int size = 0; for (; buff; buff = buff->next, ++size) { ; } return size; } void print_all(const list l) { const node* buff = l.first; for (; buff; buff = buff->next) { printf("'%d' ", buff->value); } printf("\n"); } int main() { list a = {NULL, NULL}; push_back(&a, 2); push_back(&a, 3); push_back(&a, 4); push_back(&a, 5); printf("%d\n", list_size(a)); print_all(a); return 0; }
Объяснение кода листинга программы
- Включаются заголовочные файлы stdio.h и stdlib.h
- Определяется макрос DB, который выводит номер строки, где происходит ошибка
- Определяются структуры Node и List
- В функции push_back создается новый узел, и его значение присваивается переданному значению
- Если список пустой, то новый узел становится первым и последним
- В противном случае новый узел вставляется в конец списка
- В функции list_size перебираются все узлы списка, пока не будет NULL, и подсчитывается количество узлов
- В функции print_all перебираются все узлы списка, и выводится значение каждого узла
- В основной функции создается пустой список
- В список добавляются четыре элемента
- Выводится размер списка
- Выводится содержимое списка
- Программа возвращает 0, заканчивая свое выполнение
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д