Написать функцию, которая добавляет новый элемент в связный список - C (СИ)
Формулировка задачи:
Доброго времени суток, продолжаю изучать самостоятельно Си по книге Кочана Стефана "Язык программирования Си". Дошёл до указателей, основную концепцию понял, со структурами тоже более менее разобрался, но вот в конце главы об указателях стоит задача: написать ф-цию которая добавляет новый элемент в связный список. В теории не трудно, допустим есть некий список.
Чтобы вставить новый элемент необходимо создать новую структуру (n2_2) и вставить после n2
Автор даёт подсказку, функция принимает 2 аргумента: указатель на на начало списка и указатель на элемент после которого должен встать новый элемент. Мне не понятно, что она должна возвращать. Новый спиcок или указатель на него или вообще должна быть void.
.... insertElem(struct list *listStart, struct list *n)
PS. Там еще много задач на связные списки. Создать программу которая удаляет элементы, двойные связные списки и прочее. Если будет, что-то не понятно, буду писать в эту тему.
#include <stdio.h> struct list { int value; struct list *next; }; int main() { struct list n1, n2, n3; struct list *listStart; listStart = &n1; n1.value = 10; n1.next = &n2; n2.value = 20; n2.next = &n3; n3.value = 30; n3.next = NULL; return 0; }
... n2_2 = n2.next; n2.next = &n2_2; ...
Решение задачи: «Написать функцию, которая добавляет новый элемент в связный список»
textual
Листинг программы
#include <stdio.h> #include <Stdlib.h> #include <string.h> #include <stdbool.h> typedef struct Node{ int somevalue; struct Node *next; } node; node * CreateNode(node **, int); int main(){ node *base = NULL; printf("Base addres: 0x%p\n", base); node *result = CreateNode(&base, 123); if (result){ printf("Base addres: 0x%p\nNew node adres: 0x%p\nSomevalue:%d\n", base, result, result->somevalue); } free(result); return 0; } node * CreateNode(node **base, int somevalue){ node *newNode = calloc(1, sizeof(node)); if (NULL == newNode){ printf("error callocate memory for new node.Abort\n"); return NULL; } else { newNode->somevalue = somevalue; newNode->next = (node*)base; *base = (node*)&newNode; return newNode; } }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы со связным списком, для работы с памятью, для работы с строками и для работы с булевыми значениями
- Определяем структуру узла связного списка, которая содержит целочисленное значение и указатель на следующий узел
- Создаем функцию CreateNode, которая создает новый узел и добавляет его в начало связного списка
- В функции main создаем указатель на вершину связного списка и присваиваем ему значение NULL
- Выводим адрес вершины связного списка
- Создаем новый узел с помощью функции CreateNode и сохраняем его адрес в переменной result
- Если новый узел успешно создан, выводим адрес вершины связного списка, адрес нового узла и значение somevalue нового узла
- Освобождаем память, выделенную под новый узел
- Возвращаем значение 0, что означает успешное завершение работы программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д