Нужно создать Linked list - C (СИ)
Формулировка задачи:
Всем привет. Нужно создать Linked list, не совсем понимаю что должно быть в данных методах, немного начал но не уверен, буду рад подсказке
#include <stdio.h> #include <stdlib.h> typedef struct item { int num; //i added struct item *next; //i added struct item *prev; //i added } item; struct item *head = NULL; //i added struct item *curr = NULL; //i added typedef struct { } LinkedList; LinkedList * makeList() { struct item *myList= (struct item*)malloc(sizeof(struct item)); //i added } //make node item *makeNode(int key, char* data) { } int main() { LinkedList * list = NULL; list = makeList(); return 0; }
вот правельный main:
void main() { int flag = 1; LinkedList * list = NULL; list = makeList(); while (flag) { add_last(list , makeNode(nextKey(), "uninitialized")); printf("please enter 0 to stop any other number to go on\n"); scanf("%d",&flag); } printKeys(list); reverseList(list); printKeys(list); emptyList(list); }
Решение задачи: «Нужно создать Linked list»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> typedef int Value; typedef struct Node Node; typedef struct List List; struct Node { Value value; Node *next; Node *prev; }; struct List { Node *front; Node *back; }; Node * Nnew(Value v) { Node *n; n = (Node *)malloc(sizeof(Node)); if (n != NULL) { n->value = v; n->next = NULL; n->prev = NULL; } return n; } void Linit(List *l) { l->front = NULL; l->back = NULL; } void Lterm(List *l) { Node *n; while (l->front != NULL) { n = l->front->next; free(l->front); l->front = n; } l->back = NULL; } int Ladd(List *l, Value v) { Node *n; n = Nnew(v); if (n == NULL) return 1; if (l->front == NULL) l->front = n; else { n->prev = l->back; l->back->next = n; } l->back = n; return 0; } void Lprint(List *l) { Node *n; for (n = l->front; n != NULL; n = n->next) printf("%d ", n->value); } void Lreverse(List *l) { Node *f, *b, *c, *p; if (l->front == l->back) return; f = l->front; b = l->back; c = l->front; p = NULL; while (c != NULL) { c->prev = c->next; c->next = p; p = c; c = c->prev; } l->front = b; l->back = f; } int Vread(Value *v) { printf("please enter 0 to stop, any other number to go on: "); scanf("%d", v); return *v != 0; } int main(void) { List l; Value v; Linit(&l); while (Vread(&v)) Ladd(&l, v); Lprint(&l); printf("-> "); Lreverse(&l); Lprint(&l); printf("\n"); Lterm(&l); return 0; }
Объяснение кода листинга программы
- Структура Linked list реализована с использованием динамического массива, который позволяет добавлять и удалять элементы в любом месте списка.
- Код определяет три структуры: Node, List и Value.
- Структура Node представляет отдельный элемент списка и содержит значения типа Value, указатели на следующий и предыдущий элементы.
- Структура List представляет весь список и содержит указатели на первый и последний элементы.
- Функция Nnew создает новый узел со значением типа Value и возвращает его адрес. Если память не может быть выделена, функция возвращает NULL.
- Функция Linit инициализирует список, устанавливая указатели на первый и последний элементы в NULL.
- Функция Lterm освобождает память, выделенную для всех элементов списка, начиная с первого и до последнего, исключая последний элемент, который уже был освобожден.
- Функция Ladd добавляет новый элемент со значением типа Value в конец списка. Если память не может быть выделена, функция возвращает 1.
- Функция Lprint выводит все значения элементов списка, начиная с первого и до последнего.
- Функция Lreverse переворачивает список, меняя местами указатели на первый и последний элементы.
- Функция Vread считывает значение типа Value с помощью функции scanf. Значение 0 используется для остановки цикла, любой другой номер продолжает цикл.
- В функции main создается экземпляр списка, инициализируется и заполняется значениями типа Value с помощью функции Ladd.
- Затем список выводится на экран с помощью функции Lprint, после чего переворачивается с помощью функции Lreverse и снова выводится на экран.
- Наконец, функция Lterm освобождает память, выделенную для списка.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д