Инвертирование списка: программа вылетает при пустом исходном списке - C (СИ)
Формулировка задачи:
Всем привет. исправьте пожалуйста код так чтобы у меня программа не вылетала при инвертирование пустого списка. Преподаватель говорит что так не должно быть и еще буду очень благодарен за то что вы напиши комментарий к каждой строке что она означает
Вот код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <malloc.h>
#include <iostream>
using namespace std;
char str[2055];
struct floatList
{
float number;
floatList *next;
}
* begin = NULL;
void printAll()
{ // вывод списка
if(begin)
{
floatList *list;
list = begin;
int k = 0;
while(list != NULL)
{
printf("\n%i) %f", k, list->number);
list = list->next;
k++;
}
}
else
{
printf("\nList not exists");
}
printf("\n");
}
floatList *getLast(floatList *head)
{ // получить последний элемент списка
if(head == NULL)
{
return NULL;
}
while(head->next)
{
head = head->next;
}
return head;
}
void push()
{ // добавить элемент в начало списка
floatList *tmp;
tmp = begin;
begin = new(floatList);
printf("\nInput float number: ");
scanf("%s", &str);
begin->number = atof(str);
begin->next = tmp;
printAll();
}
void pop()
{ // удалить элемент из начала списка
if(begin == NULL)
{
printAll();
return;
}
begin = begin->next;
printAll();
}
void pushBack()
{ // добавить элемент в конец списка
if(!begin)
{
push();
return;
}
floatList *last = getLast(begin);
floatList *tmp = new(floatList);
printf("\nInput float number: ");
scanf("%s", &str);
tmp->number = atof(str);
tmp->next = NULL;
last->next = tmp;
printAll();
}
void popBack()
{ // удалить последний элемент списка
floatList *current = NULL;
floatList *next = NULL;
if(!begin)
{
printAll();
return;
}
current = begin;
while(current->next)
{
next = current;
current = current->next;
}
if(next == NULL)
{
begin = NULL;
}
else
{
next->next = NULL;
}
printAll();
}
void insert(floatList *head)
{ // добавить элемент на указанную позицию списка
int i = 0;
int n;
float val;
printf("\nВведите число: ");
scanf("%s", &str);
n = ceil(atof(str));
if(!begin)
{
push();
return;
}
n -= 1;
printf("\nInput float number: ");
scanf("%s", &str);
val = atof(str);
if(n == -1)
{
floatList *tmp;
tmp = begin;
begin = new(floatList);
begin->number = val;
begin->next = tmp;
return;
}
floatList *tmp = NULL;
tmp = new(floatList);
tmp->number = val;
while(i < n && head->next)
{
head = head->next;
i++;
}
if(head->next)
{
tmp->next = head->next;
}
else
{
tmp->next = NULL;
}
head->next = tmp;
printAll();
}
floatList *getNth(floatList *head, int n)
{ // получить элемент списка по его позиции
int counter = 0;
while(counter < n && head)
{
head = head->next;
counter++;
}
return head;
}
int getCount()
{ // подсчЄт количества элементов
if(begin)
{
floatList *list;
list = begin;
int k = 0;
while(list != NULL)
{
list = list->next;
k++;
}
return k-1;
}
return 0;
}
void doDeleteNth(int n)
{ // удалить элемент списка по его позиции
if (n == 0)
{
return pop();
}
else if(getCount() < n)
{
printf("\nПозиция не найдена\n");
printAll();
return;
}
else
{
floatList *prev = getNth(begin, n-1);
floatList *elm = prev->next;
prev->next = elm->next;
printAll();
}
}
void deleteNth()
{ // ввод позиции для удаления элемента из списка по его позиции
int n;
printf("\nInput position: ");
scanf("%s", &str);
n = ceil(atof(str));
if(!begin)
{
printAll();
return;
}
doDeleteNth(n);
}
void invert()
{
floatList *current = NULL;
floatList *next = NULL;
current=begin->next;
next=begin;
int k = getCount();
for (int i=1; i<=k; i++)
{
floatList *tmp;
tmp = next;
if (i==1) tmp->next=NULL;
next = new(floatList);
next->number = current->number;
next->next = tmp;
current=current->next;
}
begin=next;
printAll();
}
int main()
{
setlocale(LC_ALL, "rus");
while(true)
{
printf("Введите номер функции:\n");
printf("1) Введите новый элемент в начало списка\n");
printf("2) Введите новый элемент в конец спискаt\n");
printf("3) Введите новый элемент в заданную позицию списка\n");
printf("4) Удалить начало списка\n");
printf("5) Удалить конец списка\n");
printf("6) Удалить из позиции списка\n");
printf("7) Инвертировать список\n");
printf("8) Показать список\n");
printf("9) Выход\n");
int n;
scanf("%s", &str);
n = ceil(atof(str));
switch(n)
{
case 1:
push(); // добавление элемента в начало списка
break;
case 2:
pushBack(); // добавление элемента в конец списка
break;
case 3:
insert(begin); // вставка элемента в список в нужную позицию
break;
case 4:
pop(); // удалить первый элемент списка
break;
case 5:
popBack(); // удалить последний элемент списка
break;
case 6:
deleteNth(); // удалить элемент списка по его позиции
break;
case 7:
invert(); // удалить элементы списка по значению
break;
case 8:
printAll(); // вывести список
break;
case 9:
exit(0); // выход из программы
break;
}
}
}Решение задачи: «Инвертирование списка: программа вылетает при пустом исходном списке»
textual
Листинг программы
void invert()
{
floatList *current = NULL;
...
}
Объяснение кода листинга программы
- В функции
invert()объявлена переменнаяcurrentтипаfloatList*и инициализирована значениемNULL. - ...