Написать функцию, которая добавляет новый элемент в связный список - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток, продолжаю изучать самостоятельно Си по книге Кочана Стефана "Язык программирования Си". Дошёл до указателей, основную концепцию понял, со структурами тоже более менее разобрался, но вот в конце главы об указателях стоит задача: написать ф-цию которая добавляет новый элемент в связный список. В теории не трудно, допустим есть некий список.
#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
...
n2_2 = n2.next;
n2.next = &n2_2;
...
Автор даёт подсказку, функция принимает 2 аргумента: указатель на на начало списка и указатель на элемент после которого должен встать новый элемент. Мне не понятно, что она должна возвращать. Новый спиcок или указатель на него или вообще должна быть void. .... insertElem(struct list *listStart, struct list *n) PS. Там еще много задач на связные списки. Создать программу которая удаляет элементы, двойные связные списки и прочее. Если будет, что-то не понятно, буду писать в эту тему.

Решение задачи: «Написать функцию, которая добавляет новый элемент в связный список»

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;
    }
}

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

  1. Включаем необходимые заголовочные файлы для работы со связным списком, для работы с памятью, для работы с строками и для работы с булевыми значениями
  2. Определяем структуру узла связного списка, которая содержит целочисленное значение и указатель на следующий узел
  3. Создаем функцию CreateNode, которая создает новый узел и добавляет его в начало связного списка
  4. В функции main создаем указатель на вершину связного списка и присваиваем ему значение NULL
  5. Выводим адрес вершины связного списка
  6. Создаем новый узел с помощью функции CreateNode и сохраняем его адрес в переменной result
  7. Если новый узел успешно создан, выводим адрес вершины связного списка, адрес нового узла и значение somevalue нового узла
  8. Освобождаем память, выделенную под новый узел
  9. Возвращаем значение 0, что означает успешное завершение работы программы

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


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

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

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