Создать двусвязный список, содержащий структуры - C (СИ)
Формулировка задачи:
Здравствуйте! Помогите, пожалуйста, разобраться в чужом коде двусвязном списке!
Я пытаюсь записать туда структуры, а потом их просмотреть, и вот с последним у меня как-то не получается (соответственно, я не могу утверждать и то, что действительно что-то куда-то записываю):
Компилируется программа без ошибок и даже без варнингов (sic!), но при попытках запуска пишет "Segmentation fault". Вероятно, я как-то неправильно использую эти функции (код не мой):
из файла list.h:из файла list.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; }
struct list_node { struct list_node * next; struct list_node * prev; void * data; }; struct list { int size; struct list_node * head; };
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; }
Объяснение кода листинга программы
- В функции
list_create
создается новый экземпляр двусвязного списка. - Первым шагом выделяется память под структуру
list
. - Если размер списка равен или меньше нуля, то размер списка устанавливается равным нулю. В противном случае, размер списка устанавливается равным
size
. - Выделяется память под узел, который будет являться головой списка.
- Устанавливаются начальные значения для указателей на первый и последний элементы списка, а также на следующий и предыдущий элементы в списке.
- Функция возвращает указатель на новую структуру
list
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д