Связные списки: исправить ошибку в коде - C (СИ)

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

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

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
 
struct listNode{
    char data;
    struct listNode *nextPtr;
};
 
typedef struct listNode ListNode;
typedef ListNode *ListNodePtr;
 
void insert(ListNodePtr *sPtr, char value);
char delete1(ListNodePtr *sPtr, char value);
int isEmpty(ListNodePtr sPtr);
void printList(ListNodePtr currendtPtr);
void instructions(void);
 
int main(void)
{
    ListNodePtr startPtr = NULL;
    int choice;
    char item;
 
    setlocale(LC_ALL, "");
 
    instructions();
    printf_s("%s", "? ");
    scanf_s("%d", &choice);
 
    while (choice !=3)
    {
        switch (choice)
        {
        case 1:
            printf_s("%s", "Введите символ: ");
            scanf_s("\n%c", &item);
            insert(&startPtr, item);
            printList(startPtr);
            break;
 
        case 2:
            if (!isEmpty(startPtr))
            {
                printf_s("%s", "Введите символ, который необходимо удалить: ");
                scanf_s("\n%c", &item);
 
                if (delete1(&startPtr, item))
                {
                    printf_s("%c удалён\n", item);
                    printList(startPtr);
                } 
                else
                {
                    printf_s("%c не найден\n\n", item);
                }
            } 
            else
            {
                puts("Список пуст\n");
            }
            break;
 
        default:
            puts("Неверный выбор\n");
            instructions();
            break;
        }
 
        printf_s("%s", "? ");
        scanf_s("%d", &choice);
    }
 
    puts("Программа завершена.");
    return 0;
}
 
void instructions(void)
{
    puts("Введите свой выбор:\n"
        "  1 для ввода символа в связанный список как элемент списка\n"
        "  2 для удаления символа как элемента в связанном списке\n"
        "  3 для выхода из программы");
}
 
void insert(ListNodePtr *sPtr, char value)
{
    ListNodePtr newPtr,
                previousPtr,
                currentPtr;
 
    newPtr = malloc(sizeof(ListNode));
 
    if(newPtr == NULL) printf_s("%s", "Память не выделена"); else printf_s("%s", "Всё ок");
 
    if (newPtr != NULL)
    {
        newPtr->data = value;
        newPtr->nextPtr = NULL;
 
        previousPtr = NULL;
        currentPtr = *sPtr;
 
        while (currentPtr != NULL && value > currentPtr->data)
        {
            previousPtr = currentPtr;
            currentPtr = currentPtr->nextPtr;
        }
 
        if (previousPtr == NULL)
        {
            newPtr->nextPtr = *sPtr;
            *sPtr = newPtr;
        }
        else
        {
            previousPtr->nextPtr = newPtr;
            newPtr->nextPtr = currentPtr;
        }
    }
    else
    {
        printf_s("%c не вставлен. Память не доступна\n", value);
    }
}
 
char delete1(ListNodePtr *sPtr, char value)
{
    ListNodePtr previousPtr,
                currentPtr,
                tempPtr;
 
    if (value == (*sPtr)->data )
    {
        tempPtr = *sPtr;
        *sPtr = (*sPtr)->nextPtr;
        free(tempPtr);
        return value;
    } 
    else
    {
        previousPtr = *sPtr;
        currentPtr = (*sPtr)->nextPtr;
 
        while (currentPtr != NULL && currentPtr->data != value)
        {
            previousPtr = currentPtr;
            currentPtr = currentPtr->nextPtr;
        }
 
        if (currentPtr != NULL)
        {
            tempPtr = currentPtr;
            previousPtr->nextPtr = currentPtr->nextPtr;
            free(tempPtr);
            return value;
        }
 
    }
    return '\0';
}
 
int isEmpty(ListNodePtr sPtr)
{
    return sPtr == NULL;
}
 
void printList(ListNodePtr currendtPtr)
{
    if (currendtPtr == NULL)
    {
        puts("Список пуст");
    } 
    else
    {
        puts("Список: ");
 
        while (currendtPtr != NULL)
        {
            printf_s("%c --> ", currendtPtr->data);
            currendtPtr = currendtPtr->nextPtr;
        }
        puts("Пусто\n");
    }
}
Глянул примеры исправил тему на
newPtr = (struct listNode*) malloc(sizeof(ListNode));
Однако ни чего не изменилось, кроме того, что студия перестала ругаться на присвоение newPtr указателя void. Но меня это смушает, ведь указател void вроде можно присваивать чему угодно, на сколько я понял. Вобщем прога не доконца работает. Набивал с книги, проверил всё 1 в 1. В листинге ни фига не разбираюсь на данный момент. Хотелось бы, что бы пояснили почему так???
  1. C
    Что значить в данном контексте *ListNodePtr? Что означает это - * И зачем делать псевдоним псевдонима в данном листинге???
Ну и вот как работает. После добавления 3х звеньев. А задача проги, добавление и удаление узлов в которых хранятся символы сортируемые по алфавиту (как описывается в книге). Укажите пожалуйста в чём косяк? Как исправить, а то я не могу разобраться в искомо не рабочей проге.

Решение задачи: «Связные списки: исправить ошибку в коде»

textual
Листинг программы
void instructions(void) { 
    puts("Введите свой выбор:\n"
        " 1 для ввода символа в связанный список как элемент списка\n"
        " 2 для удаления символа как элемента в связанном списке\n"
        " 3 для выхода из программы");
}

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

  1. Вводится функция instructions, которая выводит приглашение для ввода выбора пользователя.
  2. Выводится текст приглашения с тремя вариантами выбора.
  3. Варианты выбора пронумерованы и обозначены соответствующими действиями: ввод символа в связанный список как элемент списка, удаление символа как элемента в связанном списке, выход из программы.

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


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

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

11   голосов , оценка 4.545 из 5