Удалить все элементы списка. Не работает 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");
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д