Удалить все элементы списка. Не работает delete - C (СИ)

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

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

Нужно удалить все элементы односвязанного списка и пришло вот такое решение:
Листинг программы
  1. ...
  2. void dall(LISTNODEPTR startPtr)
  3. {
  4. if (startPtr!=NULL)
  5. {
  6. dall(startPtr->nextPtr);
  7. delete (startPtr);
  8. }
  9. }
  10. ...
но проблема в том, что функция delete не работает и выкидывает программу. Что делать и почему так происходит? P.S. free работает так же

Решение задачи: «Удалить все элементы списка. Не работает delete»

textual
Листинг программы
  1. // laba_3.cpp: определяет точку входа для консольного приложения.
  2. #include "stdafx.h"
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <malloc.h>
  6. #include<locale.h>
  7. struct listNode { /* структура со ссылкой на себя */
  8.     char nos;
  9.     int siz;
  10.     char name;
  11.     char art;
  12.     struct listNode *nextPtr;
  13. };
  14.  
  15. typedef struct listNode LISTNODE;
  16. typedef LISTNODE *LISTNODEPTR;
  17.  
  18. void insert (LISTNODEPTR *, char);
  19. char dele(LISTNODEPTR, char);
  20. int isEmpty(LISTNODEPTR);
  21. void printList(LISTNODEPTR);
  22. void instructions(void);
  23. char deldoub(LISTNODEPTR);
  24. int nn(LISTNODEPTR );
  25. char refur(LISTNODEPTR);
  26. void dall(LISTNODEPTR);
  27. int main ()
  28. {
  29.     setlocale(LC_ALL, "Russian");
  30.     printf("\n\t\t Лабораторная №3, вариант 10 \n\t\t============================= \n");
  31.     LISTNODEPTR startPtr = NULL;
  32.     int choice;
  33.     char item;
  34.     instructions();
  35.     printf ("Делать: ");
  36.     scanf("%d", &choice);
  37.     while (choice !=3)
  38.     {
  39.         switch (choice)
  40.         {
  41.         case 1:
  42.             printf("Значение: ");
  43.             scanf("\n%c", &item);
  44.             insert(&startPtr, item);
  45.             printList(startPtr);
  46.             break;
  47.         case 2:
  48.    
  49.             {
  50.                 printf ("Удалить: ");
  51.                 scanf ("\n%c", &item);
  52.  
  53.                 if (dele(startPtr, item)==1)
  54.                 {
  55.                     printf("%c уделён \n", item);
  56.                     printList(startPtr);
  57.                 }
  58.                 else
  59.                     printf("%c нет в списке\n\n",item);
  60.             }
  61.    
  62.             break;
  63.         case 7:
  64.             {dall(startPtr);
  65.             printList(startPtr);
  66.             }
  67.         case 6:
  68.             {
  69.             refur(startPtr);
  70.             printList(startPtr);
  71.                 break;
  72.             }
  73.         case 4:
  74.             {
  75.                 deldoub(startPtr);
  76.                 printList(startPtr);
  77.                 break;
  78.             }
  79.         default:
  80.         case 5:
  81.             {
  82.             nn(startPtr);
  83.             break;
  84.             }
  85.             printf("Плохой выбор. \n\n");
  86.             instructions ();
  87.             break;
  88.         }
  89.         printf ("\nДелать: ");
  90.         scanf("%d", &choice);
  91.     }
  92.     printf("Энд\n");
  93.     return 0;
  94. }
  95. void instructions(void)
  96. {
  97.     printf ("1-Записать в список\n2-Удалить элемент\n3-Выход\n4-Удалить повторяющиеся элементы\n5-Определить количество элементов\n");
  98. }
  99. void insert(LISTNODEPTR *sPtr, char value)
  100. {
  101.     LISTNODEPTR newPtr, previousPtr, currentPtr,endPtr;
  102.     newPtr=(LISTNODEPTR)(malloc (sizeof (LISTNODEPTR)));
  103.     if (newPtr != NULL)
  104.     {
  105.         newPtr->nos = value;
  106.         newPtr->nextPtr = NULL;
  107.         endPtr=newPtr;
  108.         previousPtr = NULL;
  109.         currentPtr = *sPtr;
  110.         while (currentPtr != NULL && value >currentPtr->nos)
  111.         {
  112.             previousPtr = currentPtr;
  113.             currentPtr = currentPtr->nextPtr;   //перемещение указателя на следующий
  114.         }
  115.         if (previousPtr == NULL)
  116.         {
  117.             newPtr->nextPtr = *sPtr;
  118.             *sPtr = newPtr;
  119.         }
  120.         else
  121.         {
  122.             previousPtr->nextPtr = newPtr;
  123.             newPtr->nextPtr = currentPtr;
  124.         }
  125.     }
  126.     else
  127.         printf("%c not inserted. No memory available.\n", value);
  128. }
  129. char dele(LISTNODEPTR startPtr, char value)
  130. {   LISTNODEPTR previousPtr, tempPtr,nextPtr,endPtr,currentPtr;
  131.     currentPtr=startPtr;
  132.     tempPtr=startPtr;
  133.  
  134.     for(tempPtr=startPtr; tempPtr!=NULL; tempPtr=tempPtr->nextPtr)
  135.     {
  136.  
  137.         for(currentPtr=currentPtr->nextPtr; currentPtr!=NULL; currentPtr=currentPtr->nextPtr)
  138.         {
  139.             if(value==currentPtr->nos)
  140.             {
  141.                 tempPtr->nextPtr=currentPtr->nextPtr;
  142.                 currentPtr=NULL;
  143.                 break;
  144.             }
  145.         }
  146.         currentPtr=tempPtr->nextPtr;
  147.     }
  148.  
  149.     return 1;
  150. }
  151.  
  152. char deldoub(LISTNODEPTR startPtr)
  153. {
  154.     LISTNODEPTR previousPtr, tempPtr,nextPtr,endPtr,currentPtr;
  155.     currentPtr=startPtr;
  156.     tempPtr=startPtr;
  157.  
  158.     for(tempPtr=startPtr; tempPtr!=NULL; tempPtr=tempPtr->nextPtr)
  159.     {
  160.  
  161.         for(currentPtr=currentPtr->nextPtr; currentPtr!=NULL; currentPtr=currentPtr->nextPtr)
  162.         {
  163.             if(tempPtr->nos==currentPtr->nos)
  164.             {
  165.                 tempPtr->nextPtr=currentPtr->nextPtr;
  166.                 currentPtr=NULL;
  167.                 break;
  168.             }
  169.         }
  170.         currentPtr=tempPtr->nextPtr;
  171.     }
  172.  
  173.     return '\0';
  174. }
  175.  
  176. int nn(LISTNODEPTR startPtr)
  177. { LISTNODEPTR nextPtr;
  178.     int nn;
  179.     for (nn=0;startPtr!=NULL; startPtr=startPtr->nextPtr)
  180.         nn++;
  181.     printf("В списке %d элементов",nn);
  182.         return nn;
  183. }
  184.  
  185. int isEmpty(LISTNODEPTR sPtr)
  186. {
  187.     return sPtr == NULL; //1 -pusto
  188. }
  189.  
  190. void printList(LISTNODEPTR currentPtr)
  191. {
  192.     if (currentPtr == NULL)
  193.         printf("Слишком пусто\n\n");
  194.     else
  195.     {
  196.         printf("Список\n");
  197.         while (currentPtr != NULL)
  198.         {
  199.             printf("%c-> ", currentPtr->nos);
  200.             currentPtr = currentPtr->nextPtr;
  201.         }
  202.         printf ("NULL\n\n");
  203.     }
  204. }

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


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

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

7   голосов , оценка 4.429 из 5

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

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

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