Реализация списков с помощью цепочек динамических объектов - C (СИ)

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

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

Здравствуйте! Проблема с реализацией списков с помощью цепочек динамических объектов. Вот написал программу, но она не работает, а именно: при вызове функции print выводит не данные из звеньев списка, а черти что, и выводит бесконечно. Видимо у меня проблема больше в понимании этой темы. Если вам не сложно, то, пожалуйста, не могли бы вы мне еще на пальцах объяснить что делает ф-ция void *malloc (size_t size), а то видимо я как-то не так понял. Вот сам код:
 
#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;   // переходим к следующему звену
           }        
  };
P.S. Видимо проблема в void insert ( list * nd , int a) (70 строка)

Решение задачи: «Реализация списков с помощью цепочек динамических объектов»

textual
Листинг программы
int *p
p=(int*)malloc(sizeof(int))

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

  1. В коде объявлена переменная типа int *p, которая будет использоваться для хранения адреса первого элемента динамического массива.
  2. Затем, с помощью функции malloc, выделено памяти размером, достаточным для хранения одного int (sizeof(int)).
  3. Выделенная память была сохранена в переменной p.
  4. После этого, в p сохраняется адрес первого элемента массива.
  5. Возвращаем управление.

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

8   голосов , оценка 4.125 из 5
Похожие ответы