Реализация списков с помощью цепочек динамических объектов - C (СИ)
Формулировка задачи:
Здравствуйте!
Проблема с реализацией списков с помощью цепочек динамических объектов. Вот написал программу, но она не работает, а именно: при вызове функции print выводит не данные из звеньев списка, а черти что, и выводит бесконечно.
Видимо у меня проблема больше в понимании этой темы. Если вам не сложно, то, пожалуйста, не могли бы вы мне еще на пальцах объяснить что делает ф-ция void *malloc (size_t size), а то видимо я как-то не так понял.
Вот сам код:
P.S.
Видимо проблема в void insert ( list * nd , int a) (70 строка)
#include <stdio.h> #include <stdlib.h> typedef struct Node *link; // указатель на звено typedef int elemtype; // тип элемента списка typedef struct Node { //звено состоит из двух частей elemtype type; // - элемент списка link next; // - указатель на следующее звено } node; typedef link list; // список задается указателем на звено void list_delete( list * nd); // удалить список nd и все его элементы void insert_( list * nd , int a); // добавить элемент с заданным целым числом a в начало списка nd void remove_( list * nd , int a ); // удалить из списка nd все элементы, содержащие заданное целое число a void print(list nd); // вывести значения, хранящиеся в элементах списка nd int main() { int i, a; list lst; // переменная типа список lst=(list)malloc(sizeof(node)); //создаем указатель printf("Vvedite nomer operacii\n kotoruyu nado vipolnit i dannie dlya nee: \n"); printf(" 1)list_delete\n"); printf(" 2)insert \n"); printf(" 3)remove \n"); printf(" 4)print \n"); printf(" 5)exit \n"); while (1) // бесконечный цикл. Выход из цикла = выход из программы = exit(0) { scanf("%d", &i ); switch (i) //выполняем выбранную пользователем операцию { case 1: list_delete( &lst ); break; case 2: scanf("%d", &a ); insert( &lst, a); break; case 3: scanf("%d", &a ); remove( &lst, a); break; case 4: print(lst); break; case 5: exit(0); break; //выход из программы default: break; } } return 0; // до этого места программа никогда не дойдет, но напишем return 0 }; void list_delete(list * nd) ///удаляем весь список { list q; while (nd) //пока не конец списка { q=nd; //отдаем ссылку на текущее звено nd = nd->next; //а сами переходим на следующее free(q); //удаляем пройденное звено } } void insert ( list * nd , int a) // вставляем число a в начало списка { list q=(list)malloc(sizeof(list)); q->type=a; // создаем отдельно звено со значением а q->next= *nd; // добавляем к этому звену остальную цепь *nd=q; // объявляем получившуюся цепь основной }; void remove( list * nd , int a) // удаляет из списка все элементы, содержащие число a { link q, ls; // ls=(list)malloc(sizeof(list)); ls=nd; while (ls) { if (ls->type == a) { q=ls; //отдаем ссылку q ls->next=ls->next->next; // отсоединяем звено которое в q free(q); //чистим звено, переданное q }; ls=ls->next; // идем дальше }; } void print(list nd) // вывести значения, хранящиеся в элементах списка nd { while (nd!=NULL) //пока не дошли до конца цепочки { printf(" %d", nd->type); //выводим наше число nd=nd->next; // переходим к следующему звену } };
Решение задачи: «Реализация списков с помощью цепочек динамических объектов»
textual
Листинг программы
int *p p=(int*)malloc(sizeof(int))
Объяснение кода листинга программы
- В коде объявлена переменная типа int *p, которая будет использоваться для хранения адреса первого элемента динамического массива.
- Затем, с помощью функции malloc, выделено памяти размером, достаточным для хранения одного int (sizeof(int)).
- Выделенная память была сохранена в переменной p.
- После этого, в p сохраняется адрес первого элемента массива.
- Возвращаем управление.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д