Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > Помогите пожалуйста исправить программу


Автор: KyKy 2.4.2006, 15:37
Написал прогу, но почему-то не работает добавление элемента в конец.(Линейные Списки)
Помогите пожалуйста исправить её.

Код

/*    callmenu.cpp
    Файл из проекта:        LinearList
    Главный файл проекта:    main.cpp    */

#include "main.h"

void callmenu(ELEMENT *start)
{
    int in=NULL;
    for( ; ; )
    {        
        //Очистка буфера
        _flushall();
        
        //вывод пунктов меню на консоль
        printf("\nLinear list - Unidirectional\nData type - integer\n\n1.Add to End\n2.Delete from Beginning\n3.Delete All\n4.Print All\n5.Insert between Two Others\n6.Exit\n\nSelect your option: ");

        in=_getche();
        //Очистка экрана
        system("cls");

        switch(in)
        {
        case 49:printf("\nAdding...\n"); Print(start); Add_End(start); Print(start);            //при нажатии 1 вызывает функцию добавления в начало списка
                break;
        case 50:printf("\nDeleting...\n");    Print(start); Del_Beg(start); Print(start);            //при нажатии 2 вызывает функцию удаления из начала списка
                break;
        case 51:printf("\nDeleting all...\n");    Print(start); Del_All(start); Print(start);        //при нажатии 3 удаляет все элементы списка
                break;
        case 52:printf("\nPrinting...\n"); Print(start);                                        //при нажатии 4 выводит содержимое списка на экран
                break;
        case 53:printf("\nInserting...\n"); Print(start); Insert(start); Print(start);            //при нажатии 5 вызывает функцию вставки элемента между 2 другими на заданную позицию
                break;
        case 54:printf("\nBail\n"); exit(1);                                                    //при нажатии 6 выходит из программы
        }

        //функция вывода ошибки при нажатии на любую жругую клавишу
        if(in>54 || in<49)
        {
            printf("Bail anyway\n");
        }

    }
}


Код

/*    del_beg.cpp
    Файл из проекта:        Linear List
    Главный файл проекта:    main.cpp    */    

#include "main.h"

//Функция удаления первого элемента списка
void Del_Beg(ELEMENT* &start)
{
    ELEMENT *del;                                        //создание указателя на удаляемый элемент
            
    //проверка на то, есть ли что-то для удаления
    if(start==NULL)
    {
        printf("\nNothing to delete\n");
        return;
    }
    
    //если элемент в списке 1, его удаление и указание "start" в пустоту для описания пустого списка
    if(start->next==NULL)
    {
        delete start;
        start=NULL;
        return;
    }

    //если элементов в списке несколько, перенос указателя на начало к следующему элементу и удаление 1-го
    if(start->next!=NULL)
    {
        del=start;
        start=del->next;
        delete del;
        return;
    }

    
}

//Функция удаления всего списка через зацикливание удаления 1-го элемента
void Del_All(ELEMENT* &start)
{
    while(start!=NULL)
    {
        Del_Beg(start);
    }
    return;
}


Код

/*    main.cpp
    Проект:                    Linear List
    Разработчик:            
    Группа:                    
    Файлы ресурсов:            callmenu.cpp
    Заголовочные файлы:        main.h    */

#include "main.h"

//главная функция проекта
void main()
{
    ELEMENT *start=NULL;        //отсутствие первого элемента
    callmenu(start);            //вызов функции меню
}


Код

/*    print.cpp
    Файл из проекта:        Linear List
    Главный файл проекта:    main.cpp    */

#include "main.h"

//Функция печати содержимого списка
void Print(ELEMENT* start)
{
    ELEMENT *print;            //создание указателя на печатаемый элемент
    
    //вывод сообщения о пустом списке, если start указывает в пустоту
    if(start==NULL)
    {
        printf("\nList is empty\n");
        return;
    }

    
    print=start;            //указатель печати прикреплен к началу списка
    printf("\n");

    //последовательная печать полей "data" всех элементов списка
    while(print!=NULL)
    {
        printf("%d ", print->data);

        print=print->next;
    }
    printf("\n\n");            //вывод 1 пустой строки после печати содержимого списка
}


Код

/*    add_end.cpp
    Файл из проекта:        Linear List
    Главный файл проекта:    main.cpp    */

#include "main.h"

//Функция добавления нового элемента в начало списка
void Add_End(ELEMENT* &start)
{
    ELEMENT *temp,
        *cur;                                    //указатель на временный элемент

    temp = new ELEMENT;                                //создание временного элемента и задание указателя

    //проверка на правильность создания элемента
    if(temp==NULL)
    {
        printf("Element construction error\n");
        return;
    }
    
    //ввод информации в поле "data" элемента
    int data;
    printf("Input your data: ");
    //ввод данных с проверкой, при неправильном вводе - удаление элемента для избежания memory leak
    if(scanf("%d", &data)!=1)
    {
        printf("Error reading data\n");
        delete temp;
        return;
    }
    
    temp->data=data;//запись данных в элемент
    temp->next=NULL;

    //описание элемента как 1-го в списке, если до этого он был пуст
    if(start==NULL)
    {    
        
        start=temp;
        start->next=NULL;
        return;
    }

    else{
    cur=start;
    while( cur->next != NULL)
        cur=cur->next;
    cur->next=temp;
        return;}



Код

/*    main.h
    Заголовочный файл проекта:        Linear List
    Главная функция находится в:    main.cpp    */

#ifndef MAIN_H
#define MAIN_H

    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>

    //Описание полей, которые будет содержать элемент
    struct ELEMENT
    {
        int data;
        ELEMENT* next;
    };

    //Прототипы функций
    void callmenu(ELEMENT* start);
    void Add_End(ELEMENT* &start);
    void Del_Beg(ELEMENT* &start);
    void Del_All(ELEMENT* &start);
    void Print(ELEMENT* start);
    void Insert(ELEMENT* &start);

#endif

Добавлено @ 15:39
хех левая буква зю была) теперь всё супер.
Добавлено @ 15:46
1.Принимаю любую критику.
2.Вопрос что нужно исправть чтобы получился кольцевой список?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)