Линейный список. Картотека

евг

Картотека: Адрес Номер ТипДля представления картотеки в ОП ПЭВМ воспользоваться структурой данных – ЛОС (линейный однонапр список). В программе предусмотреть: - поиск элемента ЛоС по ключу; - вставку элемента в ЛоС; - удаление элемента из ЛоС; - вывод картотеки на принтер.
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<iomanip.h>
#define n 3
class los
{int b;
int numb;
char adres[20];
char tip[20];
los *next;
public:
static los*p;
void input();
void output();
void search();
void del();
void add();
};
los*los::p;
void los::input()
{los *r;
p=new los;
cout<<"\n Key 1: ";
cin>>p->b;
cout<<"\n № magazina 1: ";
cin>>p->numb;
cout<<"\n Adres 1: ";
gets(p->adres);
cout<<"\n Tip magazina 1: ";
gets(p->tip);
p->next = NULL;
r=p;
for(int i=0; i<n-1; i++)
{clrscr();
r = r->next;
r=new los;
cout<<"\n Key "<<(i+2)<<": ";
cin>>r->b;
cout<<"\n № magazina "<<(i+2)<<": ";
cin>>r->numb;
cout<<"\n Adres "<<(i+2)<<": ";
gets(r->adres);
cout<<"\n Tip magazina "<<(i+2)<<": ";
gets(r->tip);
r->next=NULL;
getch();
}
void los::output()
{clrscr();
lds *r;
r=p;
cout<<"\n"<<"ЪДДДДДВДДДДДДДДДДВДДДДДДДДДДВДДДДДДДДДДВДДДДДДДДДДВДДДДДДДДДДДї";
cout<<"\n"<<"і"<<setw(5)<<"Key"<<"і"<<setw(10)<<"Numb"<<"і"<<setw(15)<<"Adres"<<"і"<<setw(10)<<"Tip"<<"і";
cout<<"\n"<<"ГДДДДДЕДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДґ";
while(r!=NULL)
{cout<<"\n"<<"і"<<setw(5)<<r->b<<"і"<<setw(10)<<r->numb<<"і"<<setw(15)<<r->adres<<"і"<<setw(10)<<r->tip<<"і";
r=r->next;}
cout<<"\n"<<"АДДДДДБДДДДДДДДДДБДДДДДДДДДДБДДДДДДДДДДБДДДДДДДДДДБДДДДДДДДДДДЩ";
getch();
}
void los::search()
 {clrscr();
  los *r;
  int key;
  cout<<"\n Vvedite kluch dlya poiska: ";
  cin>>key;
  r=p;
 
 while(r != NULL && r->b != key)
  r=r->next;
if(r->b==key)
{cout<<"\n"<<"ЪДДДДДВДДДДДДДДДДВДДДДДДДДДДВДДДДДДДДДДВДДДДДДДДДДВДДДДДДДДДДДї";
cout<<"\n"<<"і"<<setw(5)<<"Key"<<"і"<<setw(10)<<"Numb"<<"і"<<setw(15)<<"Adres"<<"і"<<setw(10)<<"Tip"<<"і";
cout<<"\n"<<"ГДДДДДЕДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДґ";
  cout<<"\n"<<"і"<<setw(5)<<r->b<<"і"<<setw(10)<<r->numb<<"і"<<setw(10)<<r->adres<<"і"<<setw(10)<<r->tip<<"і";
  cout<<"\n"<<"АДДДДДБДДДДДДДДДДБДДДДДДДДДДБДДДДДДДДДДБДДДДДДДДДДБДДДДДДДДДДДЩ";
  }
else
 cout<<"\n Nichego ne najdeno.";
getch();
}
void los::del()
 
  
getch();
}
void lds::add()
{clrscr();
los *r;
los *ptr;
ptr=new los;
int key;
cout<<"\n Vvedite kluch elementa posle kotorogo dobavit' novij: ";
cin>>key;
r=p;
while(r != NULL && r->b != key)
r = r->next;
if(r->b == key)
   {if(r->next != NULL)
       {cout<<"\n Dobavlenie: ";
    cout<<"\n Vvedite kluch novogo magazina: ";
    cin>>ptr->b;
    cout<<"\n Vvedite number novogo magazina: ";
    cin>>ptr->numb;
    cout<<"\n Vvedite adres  novogo magazina: ";
    gets(ptr->adres);
    cout<<"\n Vvedite tip novogo magazina: ";
    gets(ptr->tip);
    ptr->next = r->next;
    r->next = ptr;
       }
    else
       {cout<<"\n Dobavlenie: ";
    cout<<"\n Vvedite kluch novogo magazina: ";
    cin>>ptr->b;
    cout<<"\n Vvedite number novogo magazina: ";
    cin>>ptr->numb;
    cout<<"\n Vvedite adres  novogo magazina: ";
    gets(ptr->adres);
    cout<<"\n Vvedite tip novogo magazina: ";
    gets(ptr->tip);
    ptr->next=NULL;
    r->next=ptr;
       }
   }
getch();
}
void menu()
{clrscr();
cout<<"\n 1-Vvod dannih";
cout<<"\n 2-Vivod dannih";
cout<<"\n 3-Poisk dannih po kluchu";
cout<<"\n 4-Udalenie dannih po kluchu";
cout<<"\n 5-Vstavka dannih posle elementa";
cout<<"\n ESC-vihod iz programmi";
}
void main()
{clrscr();
 char punkt;
 while(punkt!=27)
 {menu();
  punkt=getch();
  clrscr();
  switch(punkt)
  {case '1':input();getch;break;
   case '2':output();getch;break;
   case '3':search();getch();break;
   case '4':del();getch();break;
   case '5':add();getch();break;
  }
 }
}
Вот собственно код.Не могу сделать удаление и добавление.А из 3 магазинов выводится только первый .Помогите пожалкйста!
14 ответов

евг

евг, оформите нормально, читать невозможно!


евг

а что именно?


евг

евг, да все, читать невозможно... лучше тогда покажите те части, которые не работают...


евг

Неправильно работает вывод
void los::output()
{clrscr();
los *r;
r=p;
cout<<"\n"<<"ЪДДДДДВДДДДДДДДДДВДДДДДДДДДДВДДДДДДДДДДВДДДДДДДДДДВДДДДДДДДДДДї";
cout<<"\n"<<"і"<<setw(5)<<"Key"<<"і"<<setw(10)<<"Numb"<<"і"<<setw(10)<<"Adres"<<"і"<<setw(10)<<"Tip"<<"і";
cout<<"\n"<<"ГДДДДДЕДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДґ";
while(r!=NULL)
{cout<<"\n"<<"і"<<setw(5)<<r->b<<"і"<<setw(10)<<r->numb<<"і"<<setw(10)<<r->adres<<"і"<<setw(10)<<r->tip<<"і";
r=r->next;}
cout<<"\n"<<"АДДДДДБДДДДДДДДДДБДДДДДДДДДДБДДДДДДДДДДБДДДДДДДДДДБДДДДДДДДДДДЩ";
getch();
}
не работает добавление и удаление.
void los::del()
{clrscr();
 los *r;
 los *ptr;
 int key;
 cout<<"\n Vvedite kluch elementa dlya udaleniya: ";
 cin>>key;
 r = p;
 while(r != NULL && r->b != key)
  r = r->next;
 if(r->b == key)
  {if( r->next != NULL)
   {ptr = r->next;
    delete(r);
    r = ptr;}
  else
    {if(r->prev == NULL)
     {p = p->next;
      delete(r);
      r = p;
      }
     
       
     }
   }
getch();
}
void los::add()
{clrscr();
los *r;
los *ptr;
ptr=new los;
int key;
cout<<"\n Vvedite kluch elementa posle kotorogo dobavit' novij: ";
cin>>key;
r=p;
while(r != NULL && r->b != key)
r = r->next;
if(r->b == key)
   {if(r->next != NULL)
       {cout<<"\n Dobavlenie: ";
    cout<<"\n Vvedite kluch novogo magazina: ";
    cin>>ptr->b;
    cout<<"\n Vvedite number novogo magazina: ";
    cin>>ptr->numb;
    cout<<"\n Vvedite adres  novogo magazina: ";
    gets(ptr->adres);
    cout<<"\n Vvedite tip novogo magazina: ";
    gets(ptr->tip);
    ptr->next = r->next;
    r->next = ptr;
       }
    else
       {cout<<"\n Dobavlenie: ";
    cout<<"\n Vvedite kluch novogo magazina: ";
    cin>>ptr->b;
    cout<<"\n Vvedite number novogo magazina: ";
    cin>>ptr->numb;
    cout<<"\n Vvedite adres  novogo magazina: ";
    gets(ptr->adres);
    cout<<"\n Vvedite tip novogo magazina: ";
    gets(ptr->tip);
    ptr->next=NULL;
    r->next=ptr;
       }
   }
getch();
}


евг

евг, так, давайте с выводом разбираться, что именно в выводе не так?


евг

я забиваю 3 магазина.выводит только первый.


евг

евг, ну если выводится первый, значит он не указывает на следующий... добавляете через
void los::add()
?


евг

нене это вставку элемента в ЛоС


евг

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


евг

некачественный код... подумайте о людях, которые будут сопровождать ваши коды...кривое форматирование, ни одного комментария...


евг

а как это выглядит(я про распределение памяти)


евг

евг, вот вырвал кусок из очереди с приоритетами на основе двусвязного списка...
void add(const int value, const int _prior)             
        {                                                   
            Queue *Ptr = new Queue;
            Ptr -> data = value;
            Ptr -> prioritet = _prior;
 
            if(Head == NULL)
            {
                Head = Tail = Ptr;
                Ptr -> pred = NULL;
                Ptr -> next = NULL;
            }
            else
            {
                Queue *tmp = Tail;
                Queue *cur = NULL;
 
                if(Head != Tail)
                {
                    while((tmp != NULL) && (Ptr -> prioritet > tmp -> prioritet))
                    {
                        cur = tmp;
                        tmp = tmp -> pred;
                    }
 
                    if(tmp == NULL)
                    {
                        Ptr -> next = Head;
                        Ptr -> pred = NULL;
                        Head -> pred = Ptr;
                        Head = Ptr;
                    }
                    else
                    {
                        tmp -> next = Ptr;
                        Ptr -> pred = tmp;
                        Ptr -> next = cur;
                    }
                }
                else
                {
                    if(Head -> prioritet < Ptr -> prioritet)
                    {
                        Head -> pred = Ptr;
                        Ptr -> next = Head;
                        Ptr -> pred = NULL;
                        Head = Ptr;
                    }
                    else
                    {
                        Tail -> next = Ptr;
                        Ptr -> pred = Head;
                        Ptr -> next = NULL;
                        Tail = Ptr;
                    }
                }
            }
        }
евг, ну вот что-то вроде такого должно быть, заметь, и читать приятно и понятно
// obr.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <locale>               //для работы с юникод 
#include <string>
using namespace std;
 
struct List
{
    List *next;
 
    int number;                         //Номер.
    wstring tip,                        //тип.
    adress;                             //aдрес.
 
    void EnterInf()                     //функция для инициализации элементов списка
    {
        wcout << L"Введите адрес: ";
            cin.ignore();
            getline(wcin, adress);
        wcout << L"Введите номер: ";
            cin >> number;
        wcout << L"Введите тип: ";
            cin.ignore();
            getline(wcin, tip);
 
        cout << endl;
    }
 
    void ShowInf()                      //функция выода содержимого эл-ов списка
    {
        wcout << L"\nAдрес: " << setw(10 - strlen("Aдрес")) << adress;
        wcout << L"\nHомер: " << setw(10 - strlen("Hомер")) << number;
        wcout << L"\nTип: " << setw(10 - strlen("Tип")) << tip << "\n";
    }
 
    int getNumber()                     //функция получения номера эл-а списка(ключ)
    {
        return number;
    }
};
 
class ListNode
{
    private:
        List *Head;                     //голова списка
 
    public:
        ListNode()                      //конструктор по умолчанию
        {
            Head = NULL;                //изначально список пустой
        }
 
        void addToBack()        //добавляем в конец
        {
            List *Ptr = new List;       //выделяем память
            Ptr -> EnterInf();          //инициализируем
            Ptr -> next = NULL;
 
            if(Head == NULL)            //если список пустой
            {
                Head = Ptr;
            }
            else                        //иначе добавляем в конец
            {
                List *Ptr_f = Head; 
 
                while(Ptr_f -> next != NULL)        //ищем последний элемент
                    Ptr_f = Ptr_f -> next;
 
                Ptr_f -> next = Ptr;                //последний указывает на новый
                Ptr -> next = NULL;
            }
        }
 
        void removeFromBack()
        {
            List *temp;
 
            if(Head == NULL)                    //если список пуст
                wcout << L"Список пуст!\n";
            else if(Head -> next == NULL)       //если в списке один элемент
            {
                delete Head;
                Head = NULL;
            }
            else                                //если несколько элементов
            {
                List *Ptr_f = Head;
                while(Ptr_f -> next != NULL)        //ищем последний
                {
                    temp = Ptr_f;
                    Ptr_f = Ptr_f -> next;
                }
 
                delete Ptr_f;                   //удаляем последний
                temp -> next = NULL;                //элемент перед последним теперь последний
            }
        }
 
        void showCard(const int &_number)
        {
            List *current = Head;
            bool flag = false;
 
            if(Head -> next != NULL)                //ищем во всем списке
            {
                while(current -> getNumber() != _number && current -> next != NULL)
                {
                    if(current -> getNumber() == _number)
                    //если ключ найден выводим информацию
                    {
                        flag = true;
                        wcout << L"Информация о карточке: ";
                            current -> ShowInf();
 
                        break;      //прекращаем цикл, так как ключ уникален
                                    //и больше совпадений не будет
                    }
 
                    current = current -> next;
                }
            }
 
            if(!flag)                                   //если ключ не найден
                wcout << L"Карточка не найдена!\n";
 
            cout << endl;
        }
 
        void showItem()                     //выводим весь список
        {
            List *current = Head;
            if(current == NULL)             //если список пустой 
                wcout << L"Список пуст!";
            else                            //иначе выводим до конца
            {
                wcout << L"Список: ";
                while(current != NULL)
                {
                    current -> ShowInf();
                    current = current -> next;          //переходим на следующий
                }
            }
 
            cout << endl;
        }
};
 
void instructions();                    //инструкция к меню
void Menu();                            //меню
 
int _tmain(int argc, _TCHAR* argv[])
{
    wcout.imbue(locale(".866"));            //для вывода юникод строк
    wcin.imbue(locale(".866"));             //для ввода юникод строк
 
    Menu();                                 //вызываем функцию меню
 
    cout << "\n\n";
    return 0;
}
 
void Menu()
{
    ListNode Univers;
    int choice, pos_el, value;
 
    instructions();                     //вызываем функцию инструкции к меню
 
    do{
        cout << "? ";
            cin >> choice;              //выбираем пункт меню
 
        switch(choice)
        {
            case 1:
                Univers.addToBack();
                Univers.showItem();
                break;
            case 2:
                Univers.removeFromBack();
                Univers.showItem();
                break;
            case 3:
                wcout << L"Введите номер карточки: ";
                    cin >> value;
 
                Univers.showCard(value);
                break;
        }
    }while(choice != 4);
 
    wcout << L"Конец работы со списком!\n";
}
 
void instructions()
{
    wcout << L"Выберите:\n" <<
        L"1 - Добавить в список\n" <<
        L"2 - Удалить из списка\n" <<
        L"3 - Поиск по номеру\n" <<
        L"4 - Завершить обработку списка\n";
}


евг

спасибо!как я понял это у Вас удавление с конца.а как удалять по ключу элемента.Я ввел удаление по 3 ключу,например,он мне должен удалить 3


евг

евг, в задание не было удаления по ключу, это нужно писать новую функциюевг, вот тут и с удалением по ключу
// obr.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <locale>               //для работы с юникод 
#include <string>
using namespace std;
 
struct List
{
    List *next;
 
    int number;                         //Номер.
    wstring tip,                        //тип.
    adress;                             //aдрес.
 
    void EnterInf()                     //функция для инициализации элементов списка
    {
        wcout << L"Введите адрес: ";
            cin.ignore();
            getline(wcin, adress);
        wcout << L"Введите номер: ";
            cin >> number;
        wcout << L"Введите тип: ";
            cin.ignore();
            getline(wcin, tip);
 
        cout << endl;
    }
 
    void ShowInf()                      //функция выода содержимого эл-ов списка
    {
        wcout << L"\nAдрес: " << setw(10 - strlen("Aдрес")) << adress;
        wcout << L"\nHомер: " << setw(10 - strlen("Hомер")) << number;
        wcout << L"\nTип: " << setw(10 - strlen("Tип")) << tip << "\n";
    }
 
    int getNumber()                     //функция получения номера эл-а списка(ключ)
    {
        return number;
    }
};
 
class ListNode
{
    private:
        List *Head;                     //голова списка
 
    public:
        ListNode()                      //конструктор по умолчанию
        {
            Head = NULL;                //изначально список пустой
        }
 
        void addToBack()        //добавляем в конец
        {
            List *Ptr = new List;       //выделяем память
            Ptr -> EnterInf();          //инициализируем
            Ptr -> next = NULL;
 
            if(Head == NULL)            //если список пустой
            {
                Head = Ptr;
            }
            else                        //иначе добавляем в конец
            {
                List *Ptr_f = Head; 
 
                while(Ptr_f -> next != NULL)        //ищем последний элемент
                    Ptr_f = Ptr_f -> next;
 
                Ptr_f -> next = Ptr;                //последний указывает на новый
                Ptr -> next = NULL;
            }
        }
 
        void removeFromBack()
        {
            List *temp;
 
            if(Head == NULL)                    //если список пуст
                wcout << L"Список пуст!\n";
            else if(Head -> next == NULL)       //если в списке один элемент
            {
                delete Head;
                Head = NULL;
            }
            else                                //если несколько элементов
            {
                List *Ptr_f = Head;
                while(Ptr_f -> next != NULL)        //ищем последний
                {
                    temp = Ptr_f;
                    Ptr_f = Ptr_f -> next;
                }
 
                delete Ptr_f;                   //удаляем последний
                temp -> next = NULL;                //элемент перед последним теперь последний
            }
        }
 
        void showCard(const int &_number)
        {
            List *current = Head;
            bool flag = false;
 
            if(Head -> next != NULL)                //ищем во всем списке
            {
                while(current -> getNumber() != _number && current -> next != NULL)
                {
                    if(current -> getNumber() == _number)
                    //если ключ найден выводим информацию
                    {
                        flag = true;
                        wcout << L"Информация о карточке: ";
                            current -> ShowInf();
 
                        break;      //прекращаем цикл, так как ключ уникален
                                    //и больше совпадений не будет
                    }
 
                    current = current -> next;
                }
            }
 
            if(!flag)                                   //если ключ не найден
                wcout << L"Карточка не найдена!\n";
 
            cout << endl;
        }
 
        void removeByKey(int const value)
        //ключом будет номер карточки(т.к. он уникален)
        {
            List *current = Head;
 
            if(value == Head -> getNumber())    //если искомый ключ в первом эл-те
            {
                List *tmp = Head -> next;       //переменная иници эл-ом после головы
                delete Head;                    //удаляем голову
                Head = tmp;                     //голова равна следующему
            }
            else
            {
                List *temp = NULL;
                bool flag = false;
 
                while(current != NULL)
                //ищем во все списке
                {
                    if(current -> getNumber() == value)
                    //если ключ найден
                    {
                        flag = true;    
                        break;          //прекращаем поиск
                    }
             
                    temp = current;                 //предыдущий эл-т
                    current = current -> next;      //удаляемый эл-т
                }
                
                if(!flag)                                   //если ключ не найден
                    wcout << L"Карточка не найдена!\n";
                else
                {
                    temp -> next = current -> next;     //предыдущ указывает на эл-т
                                                        //после удаляемого
                    delete current;                     //удаляем нужный
                }
 
            }
 
        }
 
        void showItem()                     //выводим весь список
        {
            List *current = Head;
            if(current == NULL)             //если список пустой 
                wcout << L"Список пуст!";
            else                            //иначе выводим до конца
            {
                wcout << L"Список: ";
                while(current != NULL)
                {
                    current -> ShowInf();
                    current = current -> next;          //переходим на следующий
                }
            }
 
            cout << endl;
        }
};
 
void instructions();                    //инструкция к меню
void Menu();                            //меню
 
int _tmain(int argc, _TCHAR* argv[])
{
    wcout.imbue(locale(".866"));            //для вывода юникод строк
    wcin.imbue(locale(".866"));             //для ввода юникод строк
 
    Menu();                                 //вызываем функцию меню
 
    cout << "\n\n";
    return 0;
}
 
void Menu()
{
    ListNode Univers;
    int choice, value;
 
    instructions();                     //вызываем функцию инструкции к меню
 
    do{
        cout << "? ";
            cin >> choice;              //выбираем пункт меню
 
        switch(choice)
        {
            case 1:
                Univers.addToBack();
                Univers.showItem();
                break;
            case 2:
                Univers.removeFromBack();
                Univers.showItem();
                break;
            case 3:
                wcout << L"Введите номер карточки: ";
                    cin >> value;
 
                Univers.showCard(value);
                break;
            case 4:
                wcout << L"Введите ключ карточки: ";
                    cin >> value;
 
                Univers.removeByKey(value);
                Univers.showItem();
                break;
        }
    }while(choice != 5);
 
    wcout << L"Конец работы со списком!\n";
}
 
void instructions()
{
    wcout << L"Выберите:\n" <<
        L"1 - Добавить в список\n" <<
        L"2 - Удалить из списка\n" <<
        L"3 - Поиск по номеру\n" <<
        L"4 - Удаление по ключу\n" <<
        L"5 - Завершить обработку списка\n";
}