Нужно создать 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;
}

Объяснение кода листинга программы

  1. Структура Linked list реализована с использованием динамического массива, который позволяет добавлять и удалять элементы в любом месте списка.
  2. Код определяет три структуры: Node, List и Value.
  3. Структура Node представляет отдельный элемент списка и содержит значения типа Value, указатели на следующий и предыдущий элементы.
  4. Структура List представляет весь список и содержит указатели на первый и последний элементы.
  5. Функция Nnew создает новый узел со значением типа Value и возвращает его адрес. Если память не может быть выделена, функция возвращает NULL.
  6. Функция Linit инициализирует список, устанавливая указатели на первый и последний элементы в NULL.
  7. Функция Lterm освобождает память, выделенную для всех элементов списка, начиная с первого и до последнего, исключая последний элемент, который уже был освобожден.
  8. Функция Ladd добавляет новый элемент со значением типа Value в конец списка. Если память не может быть выделена, функция возвращает 1.
  9. Функция Lprint выводит все значения элементов списка, начиная с первого и до последнего.
  10. Функция Lreverse переворачивает список, меняя местами указатели на первый и последний элементы.
  11. Функция Vread считывает значение типа Value с помощью функции scanf. Значение 0 используется для остановки цикла, любой другой номер продолжает цикл.
  12. В функции main создается экземпляр списка, инициализируется и заполняется значениями типа Value с помощью функции Ladd.
  13. Затем список выводится на экран с помощью функции Lprint, после чего переворачивается с помощью функции Lreverse и снова выводится на экран.
  14. Наконец, функция Lterm освобождает память, выделенную для списка.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.867 из 5
Похожие ответы