Реализация списков с помощью цепочек динамических объектов - 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 сохраняется адрес первого элемента массива.
- Возвращаем управление.