Удалить все элементы списка. Не работает delete - C (СИ)
Формулировка задачи:
Нужно удалить все элементы односвязанного списка и пришло вот такое решение:
но проблема в том, что функция delete не работает и выкидывает программу. Что делать и почему так происходит? P.S. free работает так же
...
void dall(LISTNODEPTR startPtr)
{
if (startPtr!=NULL)
{
dall(startPtr->nextPtr);
delete (startPtr);
}
}
...Решение задачи: «Удалить все элементы списка. Не работает delete»
textual
Листинг программы
// laba_3.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include<locale.h>
struct listNode { /* структура со ссылкой на себя */
char nos;
int siz;
char name;
char art;
struct listNode *nextPtr;
};
typedef struct listNode LISTNODE;
typedef LISTNODE *LISTNODEPTR;
void insert (LISTNODEPTR *, char);
char dele(LISTNODEPTR, char);
int isEmpty(LISTNODEPTR);
void printList(LISTNODEPTR);
void instructions(void);
char deldoub(LISTNODEPTR);
int nn(LISTNODEPTR );
char refur(LISTNODEPTR);
void dall(LISTNODEPTR);
int main ()
{
setlocale(LC_ALL, "Russian");
printf("\n\t\t Лабораторная №3, вариант 10 \n\t\t============================= \n");
LISTNODEPTR startPtr = NULL;
int choice;
char item;
instructions();
printf ("Делать: ");
scanf("%d", &choice);
while (choice !=3)
{
switch (choice)
{
case 1:
printf("Значение: ");
scanf("\n%c", &item);
insert(&startPtr, item);
printList(startPtr);
break;
case 2:
{
printf ("Удалить: ");
scanf ("\n%c", &item);
if (dele(startPtr, item)==1)
{
printf("%c уделён \n", item);
printList(startPtr);
}
else
printf("%c нет в списке\n\n",item);
}
break;
case 7:
{dall(startPtr);
printList(startPtr);
}
case 6:
{
refur(startPtr);
printList(startPtr);
break;
}
case 4:
{
deldoub(startPtr);
printList(startPtr);
break;
}
default:
case 5:
{
nn(startPtr);
break;
}
printf("Плохой выбор. \n\n");
instructions ();
break;
}
printf ("\nДелать: ");
scanf("%d", &choice);
}
printf("Энд\n");
return 0;
}
void instructions(void)
{
printf ("1-Записать в список\n2-Удалить элемент\n3-Выход\n4-Удалить повторяющиеся элементы\n5-Определить количество элементов\n");
}
void insert(LISTNODEPTR *sPtr, char value)
{
LISTNODEPTR newPtr, previousPtr, currentPtr,endPtr;
newPtr=(LISTNODEPTR)(malloc (sizeof (LISTNODEPTR)));
if (newPtr != NULL)
{
newPtr->nos = value;
newPtr->nextPtr = NULL;
endPtr=newPtr;
previousPtr = NULL;
currentPtr = *sPtr;
while (currentPtr != NULL && value >currentPtr->nos)
{
previousPtr = currentPtr;
currentPtr = currentPtr->nextPtr; //перемещение указателя на следующий
}
if (previousPtr == NULL)
{
newPtr->nextPtr = *sPtr;
*sPtr = newPtr;
}
else
{
previousPtr->nextPtr = newPtr;
newPtr->nextPtr = currentPtr;
}
}
else
printf("%c not inserted. No memory available.\n", value);
}
char dele(LISTNODEPTR startPtr, char value)
{ LISTNODEPTR previousPtr, tempPtr,nextPtr,endPtr,currentPtr;
currentPtr=startPtr;
tempPtr=startPtr;
for(tempPtr=startPtr; tempPtr!=NULL; tempPtr=tempPtr->nextPtr)
{
for(currentPtr=currentPtr->nextPtr; currentPtr!=NULL; currentPtr=currentPtr->nextPtr)
{
if(value==currentPtr->nos)
{
tempPtr->nextPtr=currentPtr->nextPtr;
currentPtr=NULL;
break;
}
}
currentPtr=tempPtr->nextPtr;
}
return 1;
}
char deldoub(LISTNODEPTR startPtr)
{
LISTNODEPTR previousPtr, tempPtr,nextPtr,endPtr,currentPtr;
currentPtr=startPtr;
tempPtr=startPtr;
for(tempPtr=startPtr; tempPtr!=NULL; tempPtr=tempPtr->nextPtr)
{
for(currentPtr=currentPtr->nextPtr; currentPtr!=NULL; currentPtr=currentPtr->nextPtr)
{
if(tempPtr->nos==currentPtr->nos)
{
tempPtr->nextPtr=currentPtr->nextPtr;
currentPtr=NULL;
break;
}
}
currentPtr=tempPtr->nextPtr;
}
return '\0';
}
int nn(LISTNODEPTR startPtr)
{ LISTNODEPTR nextPtr;
int nn;
for (nn=0;startPtr!=NULL; startPtr=startPtr->nextPtr)
nn++;
printf("В списке %d элементов",nn);
return nn;
}
int isEmpty(LISTNODEPTR sPtr)
{
return sPtr == NULL; //1 -pusto
}
void printList(LISTNODEPTR currentPtr)
{
if (currentPtr == NULL)
printf("Слишком пусто\n\n");
else
{
printf("Список\n");
while (currentPtr != NULL)
{
printf("%c-> ", currentPtr->nos);
currentPtr = currentPtr->nextPtr;
}
printf ("NULL\n\n");
}
}