Создать двусвязный список, содержащий структуры - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д