Создать двусвязный список, содержащий структуры - C (СИ)

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

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

Здравствуйте! Помогите, пожалуйста, разобраться в чужом коде двусвязном списке! Я пытаюсь записать туда структуры, а потом их просмотреть, и вот с последним у меня как-то не получается (соответственно, я не могу утверждать и то, что действительно что-то куда-то записываю):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"
struct list*ololo;
struct olol{
 int z;
 double qwe;
};
int main()
{
    struct olol a1; 
    struct olol b;
    struct olol c;
    a1.z=22,b.z=545,c.z=777;
    c.qwe=3.53;
    /*list_end(ololo,a1);
    list_end(ololo,b);
    list_end(ololo,c);*/
    list_start(ololo,&a1);
    list_start(ololo,&b);
    list_start(ololo,&c);
struct list_node * mn;
//  mn = list_next(ololo,LIST_START);
    mn = list_next(ololo,0);
    while(mn) {
        struct olol*m = (struct olol*)(mn->data);//делаю по аналогии с другим местом, где эта шняга используется, хотя и не знаю, работает ли там))
        printf(" %d  %f\n",m->z, m->qwe);
        mn = list_next(ololo,mn);
    }   
    return 0;
}
Компилируется программа без ошибок и даже без варнингов (sic!), но при попытках запуска пишет "Segmentation fault". Вероятно, я как-то неправильно использую эти функции (код не мой): из файла list.h:
struct list_node {
    struct list_node * next;
    struct list_node * prev;
    void * data;
};
struct list {
    int size;
    struct list_node * head;
};
из файла list.c:
struct list* list_create(int size)
{
    struct list * p = malloc(sizeof(struct list));
    if(size<=0) p->size=0; else p->size=size;
    
    p->head = malloc(sizeof(struct list_node));
    p->head->data=0;p->head->next=p->head->prev= p->head;
    return p;
}
static struct list_node*list_node_new(int size,const void*data)
{
    struct list_node *node;
    node = (struct list_node*)malloc(sizeof(struct list_node));
    
    if(size>0) {
        node->data = malloc(size);
        memcpy(node->data,data,size);
    } else node->data = (void*)data; // ГђВїГ‘€ГђµГђВґГ‘Ж’ГђВїГ‘€ГђµГђ¶ГђВґГђµГђВЅГђВёГђµ ГђВѕ ГђВІГђВѕГђ·ГђВјГђВѕГђ¶ГђВЅГђВѕГђВј ГђВёГђ·ГђВјГђµГђВЅГђµГђВЅГђВёГђВё
    return node;
}
struct list_node*list_start(struct list*p,const void*data)
{
    return list_insert(p,p->head->prev,data);
}
struct list_node* list_next(const struct list*p,const struct list_node* node)
{
    if(list_empty(p)) return 0;
    
    if(node==0) return p->head->next; // ГђВЅГђ°Г‘‡Гђ°Гђ»ГђВѕ
    if(node->next == p->head) return 0;
    
    return node->next;
}

Решение задачи: «Создать двусвязный список, содержащий структуры»

textual
Листинг программы
struct list* list_create(int size)
{
    struct list * p = malloc(sizeof(struct list));
    if(size<=0) p->size=0; else p->size=size;
    
    p->head = malloc(sizeof(struct list_node));
    p->head->data=0;p->head->next=p->head->prev= p->head;
    return p;
}

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

  1. В функции list_create создается новый экземпляр двусвязного списка.
  2. Первым шагом выделяется память под структуру list.
  3. Если размер списка равен или меньше нуля, то размер списка устанавливается равным нулю. В противном случае, размер списка устанавливается равным size.
  4. Выделяется память под узел, который будет являться головой списка.
  5. Устанавливаются начальные значения для указателей на первый и последний элементы списка, а также на следующий и предыдущий элементы в списке.
  6. Функция возвращает указатель на новую структуру list.

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

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