Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> двусвязные списки 
:(
    Опции темы
M9C1K
Дата 4.6.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.5.2009

Репутация: -1
Всего: -1



Написал программу,а она не запускается. И ошибок не выдает. Подскажите пожайлуста что не так сделал.

Разработать программу для создания и работы с двусвязным списком, состоящим из структур. Для работы со списком создать меню со следующими пунктами:

1. Создание списка.
2. Просмотр списка.
3. Добавление в конец списка новой структуры.
4. удаление записи.
5. Выход.
Структура содержит название, цену, количество товара. Удалить из списка заданный товар.

Код



#include<string.h>
#include<conio.h>
#include<io.h>
struct tov{
   char nazvanie[10];
   float cena;
   int kol;
   tov * nextElement;
   tov * lastElement;
};
//=======================================
    tov * firstElement,   //первый
         * endElement,     //последний
         * currentElement, //текущий
         * nextElement,    //следующий
         * lastElement,    //предыдущий
         * tempElement;
    int allElement=0;
    FILE *save; 
//=======================================
    void Menu(void);
    void sozdanie_SP(void);
    void prosmotr_SP();
    void dobavlenie_SP();
    void udalenie_EL();

int main(){
    firstElement=0;
    endElement=0;
    Menu();
    getche();
    return 0;
 } 
 //===================  для ввода данных ===================
void enterElement(tov * element){ 
    printf(" vvedite nazvanie tovara  : ");
    scanf("%s",&element->nazvanie);
    printf(" vvedite cenu tovara  : ");
    scanf("%f",&element->cena);
    printf(" vvedite kolichestvo tovara  : ");
    scanf("%d",&element->kol);
    }
void sozdanie_SP(void){
    tov * newElement;     //новый
    do{
        allElement++;
        newElement = new tov;
        enterElement(newElement);
        if (firstElement!=0){
                newElement->nextElement=firstElement;
                firstElement->lastElement=newElement;
                firstElement=newElement;
            } else firstElement=endElement=newElement;
    }while(getche()!=27);
    newElement->lastElement=endElement;
    endElement->nextElement=newElement;
    Menu();
 }  
 //============================== Удаление одной записи ===================================
void udalenie_EL(tov * delRec){
    delRec->lastElement->nextElement=delRec->nextElement;
    delRec->nextElement->lastElement=delRec->lastElement;
    delete delRec;
}
 //============================== Добавление записи ===================================
void dobavlenie_SP(tov * lastRec, tov * nextRec){
    tov *tempLast=lastRec;
    tov *tempNext=nextRec;
    do{
        
        allElement++;
        tov * newElement;
        newElement = new tov;
        enterElement(newElement);
        newElement->lastElement=lastRec;
        newElement->nextElement=nextRec;
        lastRec->nextElement=newElement;
        nextRec->lastElement=newElement;
        lastRec=newElement;
    }while(getche()!=27);

} 
//============================== Создание меню ===================================
void Menu(void) {

    
    printf(" MENU \n");

    printf(" F1 - VVEDITE NAZVANIE TOVARA                \n");
    printf(" F2 - PROSMOTR                               \n");
    printf(" F3 - DOBAVLENIE                             \n");
    printf(" Del - UDALENIE                              \n");
    printf(" Esc - VYHOD                                 \n");
    switch (getch()){
        case 59: sozdanie_SP();break;
        case 60: prosmotr_SP();break;
        case 61: prosmotr_SP();break;
        case 62: dobavlenie_SP();break;
        case 63: udalenie_EL();break;
        case 27: break;
        default: Menu();
        
    }
}
      

PM MAIL   Вверх
Курсант
Дата 4.6.2009, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 21.2.2009
Где: Балашиха или Воро неж

Репутация: 1
Всего: 4



какой кошмар... могу тебе написать то что тебе нужно, но только не на conio.h и string.h, а на нормальном <iostream> с применением ООП... Пойдет? Это будет С++, а не что то там...
PM ICQ Skype   Вверх
M9C1K
Дата 4.6.2009, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.5.2009

Репутация: -1
Всего: -1



Кончно пойдет!
Было бы неплохо )
PM MAIL   Вверх
Курсант
Дата 4.6.2009, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 21.2.2009
Где: Балашиха или Воро неж

Репутация: 1
Всего: 4



Вот предварительно, но функция удаления почему то работает некорректно, разбираюсь с ней пока, изучай smile

Код

#include <iostream>
using namespace std;

struct Item
{
    char itsName[10];
    int itsPrice;
    int itsCount;
    Item* itsNext;
    Item* itsPrev;
};

struct List
{
    Item* itsFirst;
    Item* itsLast;
};

void menu();
void AddItem(List&);
void DeleteItem(List&);
void PrintList(List&);

List* theList = 0;

int main()
{
   menu();
   return 0;
}

void menu()
{
    bool quit = false;
    while (true)
    {
    int choice;
    cout << " ******* MENU ***********" << endl;
    cout << "(1) Create List" << endl;
    cout << "(2) Print List Content" << endl;
    cout << "(3) Add Item in the end of List" << endl;
    cout << "(4) Delete Item from List" << endl;
    cout << "(5) Quit" << endl;
    cout << endl;
    cin >> choice;
    cout << endl;
    switch (choice)
    {
    case(1):
        if (!theList)
        {
            theList = new List;
            theList->itsFirst = 0;
            theList->itsLast = 0;
            cout << "the List has been created succesfully..." << endl << endl;
        }
        else
            cout << "the List is already created..." << endl << endl;
        break;
    case(2):
        if (theList)
            PrintList(*theList);
        else
            cout << "the List is not created..." << endl << endl;
        break;
    case(3):
        if (theList)
            AddItem(*theList);
        else
            cout << "the List is not created..." << endl << endl;
        break;
    case 4:
        if (theList)
            DeleteItem(*theList);
        else
            cout << "the List is not created..." << endl << endl;
        break;
    case(5):
        quit = true;
    }
    if (quit == true)
        break;
    }
}

void AddItem(List& theList)
{
    cout << "*** Adding new Item ***" << endl;
    cout << "Enter the name: " << endl;
    Item* newItem = new Item;
    cin >> newItem->itsName;
    cout << "Enter its price: " << endl;
    cin >> newItem->itsPrice;
    cout << "Enter its count: " << endl;
    cin >> newItem->itsCount;
    if (theList.itsLast)
    {
        theList.itsLast->itsNext = newItem;
        newItem->itsPrev = theList.itsLast;
    }
    else
    {
        theList.itsFirst = newItem;
        newItem->itsPrev = 0;
    }
    theList.itsLast = newItem;
    newItem->itsNext = 0;
    cout << "*** item was added successfully ***" << endl << endl;
}

void PrintList(List& theList)
{
    cout << "*** list content ***" << endl;
    Item* curItem = theList.itsFirst;
    while (curItem)
    {
        cout << curItem->itsName << " " << curItem->itsPrice << "$ " << curItem->itsCount << " ones." << endl;
        curItem = curItem->itsNext;
    }
    cout << "*** end ***" << endl << endl;
}

void DeleteItem(List& theList)
{
    Item* curItem = theList.itsFirst;
    int Pos;
    cout << "Enter the position of deleted item: ";
    cin >> Pos;
    cout << Pos;
    for (int i=0; i<Pos ; i++) // здесь была ";" которая все портила :) вместо цикла получалось тело которое выполн. 1 раз :)
    {
        if (curItem)
            curItem = curItem->itsNext;
    }
    if (curItem && (Pos >= 0))
    {
        if (curItem->itsPrev)
        {
            curItem->itsPrev->itsNext = curItem->itsNext;
        }
        else
        {
            theList.itsFirst = curItem->itsNext;
        }
        if (curItem->itsNext)
        {
            curItem->itsNext->itsPrev = curItem->itsPrev;
        }
        else
        {
            theList.itsLast = curItem->itsPrev;
        }
        delete curItem;
        cout << "Item № " << Pos << " has been deleted successfully..." << endl << endl; 
    }
    else
        cout << "Item № " << Pos << " not found..." << endl << endl;
}


Добавлено через 13 минут и 18 секунд
Вот, теперь исправлено и работает smile

Это сообщение отредактировал(а) Курсант - 4.6.2009, 19:45
PM ICQ Skype   Вверх
azesmcar
Дата 4.6.2009, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Курсант

К сожалению у него это работать не будет.
#include<conio.h> свидетельствует о том что у топикстартера какой-то досовский компилятор (Turbo C++, Borland C++ 3.1). В институтах часто такой используют. Так что смело удаляйте свой
#include <iostream> и замените его на 
#include <iostream.h> далее уберите using namespace std;

Цитата(Курсант @  4.6.2009,  19:32 Найти цитируемый пост)
void menu()

насчет этого я не уверен как поведет себя компилятор, но вообще это вредная привычка
Цитата(Стандарт)

An implementation shall not predefine the main function. This function shall not be overloaded. It shall
have a return type of type int, but otherwise its type is implementationdefined.
All implementations
shall allow both of the following definitions of main:

хотя компилятор топикстартера со стандартом имеет мало общего. Остальное вроде может и сработать.
PM   Вверх
Курсант
Дата 4.6.2009, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 21.2.2009
Где: Балашиха или Воро неж

Репутация: 1
Всего: 4



Ну он вроде с головой - сам переделает smile Я вообще не спец - это моя третья самостоятельная программка на C++ - недавно изучать начал, на кошках тренируюсь...

Добавлено через 4 минуты и 41 секунду
да нет, void menu () это не главная функция... главная функция у меня там int main()
PM ICQ Skype   Вверх
M9C1K
Дата 4.6.2009, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.5.2009

Репутация: -1
Всего: -1



Спасибо Вам огромное ! Теперь буду разбираться! Есть чем ночью заняться))) Еще раз ПАСИБО!
PM MAIL   Вверх
azesmcar
Дата 4.6.2009, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(Курсант @  4.6.2009,  20:02 Найти цитируемый пост)
да нет, void menu () это не главная функция... главная функция у меня там int main() 

ааааа. это menu, а так похоже на main smile smile 

Это сообщение отредактировал(а) azesmcar - 4.6.2009, 20:10
PM   Вверх
M9C1K
Дата 5.6.2009, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.5.2009

Репутация: -1
Всего: -1



Подскажите как функцию  создание списка написать (void CreateList)
PM MAIL   Вверх
Курсант
Дата 5.6.2009, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 21.2.2009
Где: Балашиха или Воро неж

Репутация: 1
Всего: 4



Попробуйте так smile

Код

void CreateList ( List*& pList)
{
    pList = new List;
}


либо так:

Код

void CreateList ( List** pList)
{
    *pList = new List;
}


в функцию по ссылке передается указатель на объект типа List, в самой функции этот указатель (то есть именно сам указатель, а не его копия) инициализируется значением указателя на созданный в динамической памяти список... Функция возвращает void, а принимает адрес ссылку на указатель.

Точно не уверен, но предположение такое - Когда мы передаем ссылку (то есть Var& ) , то на самом деле компилятор переделывает функцию таким образом, чтобы она работала с адресом переменной Var... То есть при вызове функции в стек идет адрес аргумента, а не его значение... Если в функции нам нужно инициализировать глобальный указатель, то в функцию void мы должны переслать указатель на этот указатель (2-й листинг), либо ссылку на этот указатель (1-й листинг)..

только что проверил - работает...

Вызываться функция где передается по ссылке будет так:
Код

    case(1):
        if (!theList)
        {
            CreateList (theList);
            theList->itsFirst = 0;
            theList->itsLast = 0;
            cout << "the List has been created succesfully..." << endl << endl;
        }


А там, где передается указатель - так:
Код

    case(1):
        if (!theList)
        {
            CreateList (&theList);
            theList->itsFirst = 0;
            theList->itsLast = 0;
            cout << "the List has been created succesfully..." << endl << endl;
        }


Это сообщение отредактировал(а) Курсант - 5.6.2009, 18:03
PM ICQ Skype   Вверх
M9C1K
  Дата 5.6.2009, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.5.2009

Репутация: -1
Всего: -1



Посмотри пожалуйста ,а то не хочет запускаться. Ему  CreateList (theList); не нравиться
Код
#include <iostream>
using namespace std;

struct Item
{
    char itsName[10];
    int itsPrice;
    int itsCount;
    Item* itsNext;
    Item* itsPrev;
};

struct List
{
    Item* itsFirst;
    Item* itsLast;
};

void menu();
void CreateList (List&);
void AddItem(List&);
void DeleteItem(List&);
void PrintList(List&);
void CreateList (List&);
List* theList = 0;

int main()
{
   menu();
   return 0;
}

void menu()
{
    bool quit = false;
    while (true)
    {
    int choice;
    cout << " ******* MENU ***********" << endl;
    cout << "(1) Create List" << endl;
    cout << "(2) Print List Content" << endl;
    cout << "(3) Add Item in the end of List" << endl;
    cout << "(4) Delete Item from List" << endl;
    cout << "(5) Quit" << endl;
    cout << endl;
    cin >> choice;
    cout << endl;
    switch (choice)
    {
    case(1):
        if (!theList)
        {
           CreateList (theList);
            theList->itsFirst = 0;
            theList->itsLast = 0;
            cout << "the List has been created succesfully..." << endl << endl;
        }
        else
            cout << "the List is already created..." << endl << endl;
        break;
    case(2):
        if (theList)
            PrintList(*theList);
        else
            cout << "the List is not created..." << endl << endl;
        break;
    case(3):
        if (theList)
            AddItem(*theList);
        else
            cout << "the List is not created..." << endl << endl;
        break;
    case 4:
        if (theList)
            DeleteItem(*theList);
        else
            cout << "the List is not created..." << endl << endl;
        break;
    case(5):
        quit = true;
    }
    if (quit == true)
        break;
    }
}
void CreateList ( List*& pList)
{
    pList = new List;
 
}
void AddItem(List& theList)
{
    cout << "*** Adding new Item ***" << endl;
    cout << "Enter the name: " << endl;
    Item* newItem = new Item;
    cin >> newItem->itsName;
    cout << "Enter its price: " << endl;
    cin >> newItem->itsPrice;
    cout << "Enter its count: " << endl;
    cin >> newItem->itsCount;
    if (theList.itsLast)
    {
        theList.itsLast->itsNext = newItem;
        newItem->itsPrev = theList.itsLast;
    }
    else
    {
        theList.itsFirst = newItem;
        newItem->itsPrev = 0;
    }
    theList.itsLast = newItem;
    newItem->itsNext = 0;
    cout << "*** item was added successfully ***" << endl << endl;
}

void PrintList(List& theList)
{
    cout << "*** list content ***" << endl;
    Item* curItem = theList.itsFirst;
    while (curItem)
    {
        cout << curItem->itsName << " " << curItem->itsPrice << "$ " << curItem->itsCount << " ones." << endl;
        curItem = curItem->itsNext;
    }
    cout << "*** end ***" << endl << endl;
}

void DeleteItem(List& theList)
{
    Item* curItem = theList.itsFirst;
    int Pos;
    cout << "Enter the position of deleted item: ";
    cin >> Pos;
    cout << Pos;
    for (int i=0; i<Pos ; i++)
    {
        if (curItem)
            curItem = curItem->itsNext;
    }
    if (curItem && (Pos >= 0))
    {
        if (curItem->itsPrev)
        {
            curItem->itsPrev->itsNext = curItem->itsNext;
        }
        else
        {
            theList.itsFirst = curItem->itsNext;
        }
        if (curItem->itsNext)
        {
            curItem->itsNext->itsPrev = curItem->itsPrev;
        }
        else
        {
            theList.itsLast = curItem->itsPrev;
        }
        delete curItem;
        cout << "Item № " << Pos << " has been deleted successfully..." << endl << endl; 
    }
    else
        cout << "Item № " << Pos << " not found..." << endl << endl;

}


PM MAIL   Вверх
Курсант
Дата 5.6.2009, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 21.2.2009
Где: Балашиха или Воро неж

Репутация: 1
Всего: 4



Код

void menu();
void CreateList (List&); // !!!!**** неправильно, надо void CreateList (List*&) ****!!!!!
void AddItem(List&);

PM ICQ Skype   Вверх
M9C1K
Дата 6.6.2009, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.5.2009

Репутация: -1
Всего: -1



Всем огромное спасибо! Работает!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0559 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.