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

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

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

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

Решение задачи: «Удалить все элементы списка. Не работает 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"); 
    } 
}

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


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

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

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