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

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

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

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

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

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

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

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

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


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

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

8   голосов , оценка 4.125 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы