Связные списки: исправить ошибку в коде - 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));
- Что значить в данном контексте *ListNodePtr? Что означает это - * И зачем делать псевдоним псевдонима в данном листинге???
C
Решение задачи: «Связные списки: исправить ошибку в коде»
textual
Листинг программы
void instructions(void) {
puts("Введите свой выбор:\n"
" 1 для ввода символа в связанный список как элемент списка\n"
" 2 для удаления символа как элемента в связанном списке\n"
" 3 для выхода из программы");
}
Объяснение кода листинга программы
- Вводится функция instructions, которая выводит приглашение для ввода выбора пользователя.
- Выводится текст приглашения с тремя вариантами выбора.
- Варианты выбора пронумерованы и обозначены соответствующими действиями: ввод символа в связанный список как элемент списка, удаление символа как элемента в связанном списке, выход из программы.