Как связать два элемента в связном списке?

Рейтинг: 0Ответов: 1Опубликовано: 22.03.2023

Как связать нижние элементы в списке? Что я пытался делать не помогло и выдавало ошибку сегментации? Вот код от которого я отталкиваюсь:

#include <inttypes.h> 
#include <stdlib.h> 
#include <stdio.h>
#include <time.h>
#include <string.h>

typedef struct s_list
{
    int id;
    int information;

    struct s_list *right;
    struct s_list *down;
} t_list;

t_list *create_node(int set_id, int set_information)
{
    t_list *node = (t_list *)malloc(sizeof(t_list));

    node -> id = set_id;
    node -> information = set_information;

    node ->right = NULL;
    node ->down = NULL;
}

void append_right(t_list **list, int set_id, int set_information)
{
    t_list *new_element = create_node (set_id, set_information);

    t_list *tmp = * list;

    while (tmp -> right != NULL)
    {
        tmp = tmp -> right;
    }
    tmp -> right = new_element;    
}

void append_down(t_list **list, int set_id, int set_information)
{
    t_list *new_element = create_node (set_id, set_information);

    t_list *temp = *list;

    while (temp -> down != NULL)
    {
        temp = temp -> down;
    }
    temp -> down = new_element;
    new_element -> down = NULL;
    
}

int main()
{
    t_list *list = create_node(0, 123);

    append_right(&list, 1, 234);
    append_down(&list, 2, 345);
    append_right(&list, 1, 234);
    append_down(&list, 2, 345);
    while(list != NULL)
    {
        printf("id = %d, info = %d\n", list -> id , list -> information);
        list = list -> right;
    }
    return 0;
}

Список должен получится такого формата: введите сюда описание изображения

Ответы

▲ 0

Начнем с того, что такая архитектура бессмысленна. Если узла связаны один к одному (нижний к верхнему), то смысла в горизонтальных связях нижнего ряда нет вообще. Только проблемы с поддержанием связности. Должно быть как-то так: рис1

У вас ошибка в добавлении элементов в нижний ряд. Ваша функция append_down() формирует вертикальную цепочку.

рис2

А вообще, вместо указателя на начало списка, функции вставки элемента append_right() и append_down() должны принимать указатель на предыдущий элемент верхнего списка, после которого нужно сделать вставку. Тогда можно будет вставить элемент за ним и в верхний и в нижний список.

void append_right(t_list *PrevNode, int set_id, int set_information);
void append_down(t_list *PrevNode, int set_id, int set_information);

Т.е. чтобы вставить элемент после a2, нужно передать указатель на a2.