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