Как считать связный список из файла?

260
03 марта 2018, 20:40

Помогите, как осуществить ввод списка из файла? Вывод данных в файл сделала, а как считать информацию об изданиях из файла не знаю. Очень срочно нужно. Заранее спасибо за любую помощь.

Задание: Записи содержат названия издания, газета или журнал, цена экземпляра. Добавлять новые записи так, чтобы названия были упорядочены по алфавиту.

#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#include<iomanip>
#include<iostream>
#include <string>
#include <fstream>
using namespace std;
struct spis                 //opisivaem structuru
{
    char name [20];
    int type;
    int cena;
    struct spis *prev;    //ssilka na pred.structuru
    struct spis *next;    //ssilka na sled.structuru
};
void create(void);       //opisanie funkciy
void list(spis *);
void add(void);
void sortt(void);
void addkorr(void);
struct spis *head, *tail;
int main ()
{
    char c;             //peremennaya vibora punkta menu
    while(1)
    {
        system("CLS");
        puts("1 - Sozdat' spisok");
        puts("2 - Posmotret' spisok");
        puts("3 - Dobavit' novuyu structuru v konec spiska");
        puts("4 - Korrekciya spiska s dobavleniem novoy structury");
        puts("5 - Vihod");
        c=_getch();
        switch(c)
        {
        case '1': create(); break;
        case '2': list(head); break;
        case '3': add(); break;
        case '4': addkorr(); break;
        case '5': return 0;
        default: puts("Oshibka vvoda!");
        }
    }
    free(head);                      //Osvobojdenie pamyati
}
void create(void)                   //Funkciya sozdaniya spiska
{
     system("CLS");                //Ochistka ekrana
     spis *p, *pred;               //opisanie ukazateley na structuru
     pred=NULL;
     do                            //cikl sozdaniya spiska
     {
         p=(spis *)malloc(sizeof(spis));                          //videlenie pamyati pod spisok
         cout<<"Nazvanie izdaniya: ";
         cin>>p->name;
         cout<<"Vvedite 0, esli eto jurnal i 1, esli gazeta: ";
         cin>>p->type;
         cout<<"Cena izdaniya: ";
         cin>>p->cena;
         p->prev=pred;                                            //ustanovka svyazey
         if(pred!=NULL)
             pred->next=p;
         else
             head=p;
             pred=p;
          cout<<"Dlya vihoda najmite <esc>";
          cout<<endl<<endl;
     }
     while(getch()!=27);
     tail=p;                                                     //ssilka na konec spiska
     tail->next=NULL;
}
void list(spis *p)                                              //prosmotr spiska
{
    ofstream output;
    output.open("D:\\laba16.txt", ios::out); 
    system("CLS");
    cout<<"             ----------------------------------------------------------\n";
    cout<<"             є Nazvanie izdaniya є Jurnal=0, Gazeta=1 є Cena izdaniya є\n";
    cout<<"             ----------------------------------------------------------\n";
    output<<"             ----------------------------------------------------------\n";
    output<<"             є Nazvanie izdaniya є Jurnal=0, Gazeta=1 є Cena izdaniya є\n";
    output<<"             ----------------------------------------------------------\n";
    p=head;
    while(p!=NULL)
    {
        cout<<"\n             є"<<setw(18)<<p->name<<"є"<<setw(20)<<p->type<<"є"<<setw(16)<<p->cena<<"є";
        output<<"\n             є"<<setw(18)<<p->name<<"є"<<setw(20)<<p->type<<"є"<<setw(16)<<p->cena<<"є";
        p=p->next;
    }
    cout<<"\n\nNajmite lubuyu klavishu dlya vihoda v glavnoe menu...";
    output.close();
    getch();
}
void add(void)                                               //dobavlenie novogo spiska v konec structuri
{
    spis *p, *pn;
    system("CLS");
    pn=(spis *)malloc(sizeof(spis));
    cout<<"Nazvanie izdaniya: ";
    cin>>pn->name;
    cout<<"Vvedite 0, esli eto jurnal i 1, esli gazeta: ";
    cin>>pn->type;
    cout<<"Cena izdaniya: ";
    cin>>pn->cena;
    p=tail;                                               //perehod v konec spiska
    pn->prev=tail;
    pn->next=NULL;
    p->next=pn;
    tail=pn;                                            //noviy konec spiska
}
void sortt(void)                                       //sortirovka spiska
{
    spis *p, *pn;
    int j,x,y;
    char d[20];
    do
    {
        j=1;
        p=head;                                      //perehod v nachalo spiska
        pn=p;
        p=p->next;
        while(p!=NULL)
        {
            if(strcmp(pn->name, p->name)>0)        //esli pn>p sortiruem
            {
                j=0;
                strcpy(d, pn->name);
                x=pn->type;
                y=pn->cena;
                strcpy(pn->name, p->name);
                pn->type=p->type;
                pn->cena=p->cena;
                strcpy(p->name, d);
                p->type=x;
                p->cena=y;
            }
            pn=p;                                  //perehod k sled.elementu spiska
            p=p->next;
        }
    } 
    while(j==0);
}
void addkorr(void)                             //vstavka novoy structury, korrekciya po alfavitu
{
  spis *p, *pn;
  system("CLS");
  sortt();                                    //vizov sortirovki spiska
  pn=(spis *)malloc(sizeof(spis));
  cout<<"Nazvanie izdaniya: ";
  cin>>pn->name;
  cout<<"Vvedite 0, esli eto jurnal i 1, esli gazeta: ";
  cin>>pn->type;
  cout<<"Cena izdaniya: ";
  cin>>pn->cena;
  int j, ei;
  j=0; ei=0;
  p=head;
  do
  {
      if(strcmp(pn->name, p->name)<=0 && p->prev==NULL && ei==0)   //esli pn<p, eto nachalo spiska i ei=0
      {
          j=1;                                                    //vihod iz cikla
          p->prev=pn;
          pn->prev=NULL;
          pn->next=p;
          head=pn;
          ei=1;
      }
      if(strcmp(pn->name, p->name)<=0 && ei==0)                  //esli pn<p, eto ne nachalo spiska i ei=0
      {
          j=1;
          pn->prev=NULL;
          pn->next=NULL;
          p->prev->next=pn;
          pn->prev=p->prev;
          pn->next=p;
          p->prev=pn;
          ei=1;
      }
      if(p->next==NULL && ei==0)
      {
          j=1;
          pn->prev=NULL;
          pn->next=NULL;
          p->next=pn;
          pn->prev=p;
          ei=1;
      }
      p=p->next;
  }
  while (j==0);
  cout<<"\n\nNoviy spisok dobavlen. Najmite lubuyu klavishu dlya prodoljeniya";
  getch();
}
Answer 1

Я даже не пытался понять что вы расписали тут... Контейнеры и несовсем контейнеры для хранения данных, в STL есть любого вкуса и предназначения. Чтобы хранить данные от меньшего до большего используем set<> (получится у нас сортировка вставками)

#include <iostream>
#include <set>
using namespace std;
struct  Edition {      // издание
    string s;        // название
    int p;           // цена
    Edition(const string& name, int price) :s(name), p(price) {}
    // как выводить?...
    friend ostream& operator <<(ostream& os, const Edition& ed)
    {
        os << ed.s << "   price  == " <<ed.p << endl;
        return os;
    }
};
// как определить что меньше?...
bool operator <(const Edition& e1, const Edition& e2)
{
   return e1.s < e2.s;
}
int main()
{   
    string  in;
    int n;
    std::set<Edition> editions;
    // тут вы должны определиться откуда данные : из файла или из cin...
    // допустим это из cin
    while (cin >> in >> n) {
        editions.emplace(Edition(in, n));
    }    
    //а тут вы можете выводить и в файл и в cout
    copy(editions.begin(), editions.end(), ostream_iterator<Edition>(cout, "\n"));
    return 0;
}

определив оператор '<' просто заносим в set, а множество будет содержать элементы в упорядоченном виде. Нам нужно будет определить как выводятся эти элементы и выводить их... А также можно написать компаратор вместо оператора < и обьявлять обьект set<> с этим компаратором, но это детали... Важно, чтоб вы старались пользоваться STL и программировать по принципу ООП

READ ALSO
Настройка библиотек для CMake (Windows)

Настройка библиотек для CMake (Windows)

У меня такая проблема, что я не могу настроить cmake для данного проектаЯ так понимаю по сообщению:

232
Naming conventions в c++

Naming conventions в c++

Так как в c++ нет устоявшегося соглашения по поводу именования различных сущностей, то каждый выбирает свой способОднако всегда следует использовать...

194
QT QUdpSocket прием дейтаграммы broadcast

QT QUdpSocket прием дейтаграммы broadcast

В своей программе отправляю на устройство последовательность байт(68, 1, 0)Устройство отвечает последовательностью байт(68, 1, 0)

256
Есть ли способ сократить код?

Есть ли способ сократить код?

Android Studio выдает предупреждение (длина метода = 20), что нижеследующий метод onNavigationItemSelected (длина = 21) содержит длинный кодЕсть ли способ сократить...

230