Инвертирование списка: программа вылетает при пустом исходном списке - 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; 
    ...
}

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

  1. В функции invert() объявлена переменная current типа floatList* и инициализирована значением NULL.
  2. ...

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


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

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

8   голосов , оценка 3.75 из 5
Похожие ответы