Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ConWor
0 / 0 / 0
Регистрация: 13.05.2016
Сообщений: 6
#1

Разработать программу для создания и работы с двусвязным списком - C++

07.06.2016, 14:18. Просмотров 380. Ответов 6
Метки нет (Все метки)

Задание: разработать программу для создания и работы с двусвязным списком , состоящим из структур. Для работы со списком создать меню со следующими пунктами:
1. Создание списка.
2. Просмотр списка.
3. Добавление в список новой записи.
4. Поиск и корректировка записи в списке.
5. Удаление записи из списка.
6. Сохранение списка в файле.
7. Загрузка списка из файла.

Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
//============================/////////============================
#include <malloc.h>
#include <io.h>
#include <string>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <conio.h>
 
using namespace std;
 
//=============================//////===============================
 
struct Book
{
  string name;
  string auth;
  int year;
  Book* next;
  Book* prev;
};
 
struct list
{
  Book* first;
  Book* last;
};
 
void menu();
void addBook(list&);
void delBook(list&);
void printlist(list*);
void createlist(list*&);
void savetofile(list*);
void loadfromfile(list*&);
list* thelist=0;
 
int main()
{
 
 
menu();
getch();
return 0;
}
void menu()
{
    bool quit = 0;
    while(true)
{
    int choice;
    puts("\n -----MENU-----\n");
    puts("(1) vvedite spisok \n");
    puts("(2) prosmotr \n");
    puts("(3) dobavlenie \n");
    puts("(4) ydalenie \n");
    puts("(5) save to file \n");
    puts("(6) load from file \n");
    puts("(7) exit \n");
 
    cin >> choice;
 
 switch (choice)
 {
 case(1): if (!thelist)
 {
  createlist(thelist );
    cout << " the list has been created succesfully... \n";
        }
        else
            cout << " the list is already created...\n";
        break;
    case(2):
        if (thelist)
            printlist(thelist);
        else
            cout << " the list is not created...\n";
        break;
    case(3):
        if (thelist)
            addBook(*thelist);
        else
            cout << " the list is not created...\n";
        break;
    case 4:
        if (thelist)
            delBook(*thelist);
        else
            cout << " the list is not created... \n";
        break;
    case 5:
        if (thelist)
            savetofile(thelist);
        else
            cout << " the list is not created... \n";
        break;
    case 6:
        if (!thelist)
            loadfromfile(thelist );
        break;
    case(7):
        quit = 1;
    }
    if (quit == 1)
        break;
    }
}
//==============================/////////===================================
 
void addBook(list& thelist)
{
    cout << "\n *** dobavit' novuy knigy *** \n";
    cout << " vvedite nazvanie: ";
    Book* newBook = new Book;
    cin >>* &newBook->name;
    cout << " vvedite avtora: ";
    cin >>* &newBook->auth;
    cout << " vvedite god izdania: ";
    cin >>* &newBook->year;
    if (thelist.last)
    {
        thelist.last->next = newBook;
        newBook->prev = thelist.last;
    }
    else
    {
        thelist.first = newBook;
        newBook->prev = 0;
    }
    thelist.last = newBook;
    newBook->next = 0;
    cout << "*** book was added successfully *** \n";
}
 
//=======================================///////////////==========================
void createlist (list*& thelist)
{
   thelist = new list;
   thelist->first = NULL;
   thelist->last = NULL;
   Book *p,*k=NULL;
 
   do
    {
    p = new Book;
  cout << "*** vvedite knigy *** \n";
  cout << " vvedite nazv: ";
  cin >>* &p->name;
  cout <<" vvedite avtora: ";
  cin >>* &p->auth;
  cout << " vvedite god izdania: ";
  cin >>* &p->year;
 
    if(thelist->first==NULL) thelist->first = p;
 
    p->next = NULL;
    if(k)
     {
      p->prev = k;
      k->next = p;
     }
     else
      {
       p->prev = NULL;
      }
 
    k = p;
 
    puts(" Zakonchit' - <esc>");
    }
 while (getch()!=27);
 
    thelist->last=p;
}
 
//=======================================================///////////============================
void printlist(list* thelist)
{
    printf("\n *** prosmotr knig *** \n");
    Book* curBook = thelist->first;
    while (curBook)
    {
        cout << "\n nazvanie " << curBook->name << "\n" << "avtor " << curBook->auth << "\n" << "god " << curBook->year;
        curBook = curBook->next;
    }
    cout << "\n *** end *** \n";
}
 
//=================//======================//=======================//
void delBook(list& thelist)
{Book* cur=thelist.first;
    Book* temp;
    int yr;
    cur = thelist. first;
 
    cout << " Enter the godizdania for deleted Book: \n";
        cin >>* &yr;
 
    while (cur != NULL) {
        if(cur->year < yr) {
            if (cur->prev == NULL) {    //если удаляем первый элемент
                thelist.first = cur->next;  //первым будет второй элемент в списке
                                thelist.first->prev = NULL;
                free(cur);  //высвободили память
                cur = thelist.first;    //перевели указатель на второй элемент
            }else {//если элемент не первый
                temp = cur;
                cur->prev->next = cur->next;    //с предыдущего элемета указали на последующий
                cur->next->prev = cur->prev;    //со следующего элнемента указали на предыдущий
                cur= cur->prev; //текущий будет тот, который стоит перед удаляемым
                free(temp);
            }
        } else cur = cur->next;
    }
        }
//=================//======================//=======================//
void savetofile(list* thelist)
{
    Book *p=thelist->first; //указатель на структуру
    FILE *output; // указатель на файл
        output = fopen( "file.txt","wb" ); //создаем файл, режим записи данных
        if( output != NULL )
        {
             while ( p != NULL )  //запись структуры в файл
             {
                 fwrite ( (char*)&p, sizeof (Book), 1, output );
                 p = p->next;
             }
        cout<<"Successful"<<endl;
        fclose ( output );
        }
        else
        cout<< "Imposible";
}
//=================//======================//=======================//
void loadfromfile(list*& thelist)
{
    thelist = new list;
    thelist->first = NULL;
    thelist->last = NULL;
    Book *p,*k = NULL;
     FILE *input;
    input = fopen ( "file.txt","rb" );
    while (!feof(input))    //пока не достигнут  конец файла
       {
         p = new Book; //выдедение памяти под считываемые данные
         fread ( p, sizeof ( thelist ), 1, input  );    //чтение из файла 1 структуры
         p->prev = NULL;
         p->next = NULL;
         p->prev = k;
          if ( k != NULL )
            k->next = p;
          else
            thelist->first = p;
            k = p;
        }
    thelist->last = p->prev;
    thelist->last->next = NULL;
    p = thelist->last;
    fclose ( input );//закрытие файла
    cout<<"Successful"<<endl;
}
Проблема в функциях сохранения и загрузки, функция savetofile записывает в файл РpDя @ ђд Lя p@ xя B#*2 ±PЁ@ @ аэ аэМя АпЄ2”я H*@ D7їt аэ вот это. Функция loadfromfile загружает 15 пустых записей nazvanie avtor god 0. В чем проблема?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2016, 14:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разработать программу для создания и работы с двусвязным списком (C++):

Разработать программу работы с двусвязным списком - C++
Разработать программу работы с двусвязным списком. Програма длжна реализовать сл. процедуры, вызываемые из меню: -построение списка...

Нужны задачки для упражнения в работе со списком, стеком, очередью и двусвязным списком - C++
Недавно научился строить список, стек, очередь, двусвязный список в С++, что бы закрепить навыки мне нужны задачки. Можете подсказать, где...

Задачу с использованием STL. Разработать шаблон класса для работы с односвязным списком - C++
Решить задачу с использованием STL. Разработать шаблон класса для работы с односвязным списком. Тип элементов задается как параметр...

Написать программу для работы с однонаправленым списком - C++
Написать программу, которая состоит из следующих действий: 1. Создание заголовочного файла (с расширением .h). В файле описывается: *-...

Разработать программу для реализации основных действий с двунаправленным динамическим списком (я правильно составила код?) - C++
Разработать программу для реализации основных действий с двунаправленным динамическим списком: проход по списку в ПРЯМОМ направлении с...

Программа с двусвязным списком крашится - C++
Здравствуйте! написал код для двусвязного списка, проблема следующая: все компилируется, запускается интерфейс, но какую бы функцию я...

6
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
07.06.2016, 14:23 #2
Хотя бы потому, что объект типа std::string не является POD типом
и простым копированием байтов объекта, с помощью fwrite
Вы в файл текст из объекта не запишите.
0
ConWor
0 / 0 / 0
Регистрация: 13.05.2016
Сообщений: 6
07.06.2016, 15:07  [ТС] #3
если использовать ofstream и ifstream то проблема всё равно остается, выводит пустые поля, а сохраняет Рp 8q это
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
07.06.2016, 16:16 #4
ConWor,
Цитата Сообщение от ConWor Посмотреть сообщение
если использовать ofstream и ifstream
код функции сохранения в студию.
0
ConWor
0 / 0 / 0
Регистрация: 13.05.2016
Сообщений: 6
07.06.2016, 16:18  [ТС] #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void savetofile(list* thelist)
{
    Book *p=thelist->first;
        ofstream out("file.txt",ios::out);
    while ( p != NULL )  //запись структуры в файл
             {
                 out.write((char*)&p,sizeof p);
                 p = p->next;
             }
        cout<<"Successful"<<endl;
    out.close();
    getch();
}
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
07.06.2016, 16:31 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от ConWor Посмотреть сообщение
C++
1
out.write((char*)&p,sizeof p);
Те же яйца Только еще хуже.
Попробуем объяснить.
В данном случае Вы вообще записываете в файл только указатель p,
а не данные, на которые он указывает.
Так что отбросим эту ошибку и вернемся к варианту с fwrite:
C++
1
fwrite ( (char*)p, sizeof (Book), 1, output );//но тут я тоже переделал малость, сравните с Вашим
fwrite тупо записывает байтики из памяти, которую ему дали на вход.
Просто сырую память, ни о каких строках он никогда не слышал.

Сам по себе объект типа std::string не содержит в себе текста (не берем во внимание sso),
а, например, содержит размер текста и указатель на память где лежит текст (одна из возможных реализаций).
Так вот если мы сделаем
C++
1
2
std::string str = "bla-bla-bla";
fwrite((char*)str, sizeof(std::string), 1, ofile);
То в файл из объекта str попадет сырая память,
т.е. то, что представляет из себя сам объект str в памяти.
А это, как мы выше определили длина_строки+указатель.
Вот и получим в файле, при открытии "блокнотом" символы
с кодами-байтами которыми представлен размер строки и указатель, а никакой не текст.
И, соответственно, для всего объекта Book.
Получим в файле байтики, как представлен объект в памяти.
Если в нем есть какие-то указатели, то, значения,
на которые они "указывают" записаны никуда не будут,
будут лишь записаны сами указатели.
1
ConWor
0 / 0 / 0
Регистрация: 13.05.2016
Сообщений: 6
07.06.2016, 16:50  [ТС] #7
Croessmah, Большое спасибо за помощь, функцию загрузки тоже немного изменил, вместо
C++
1
fread ( p, sizeof ( thelist ), 1, input  );    //чтение из файла 1 структуры
сделал
C++
1
fread (p, sizeof(Book), 1,input);   //чтение из файла 1 структуры
всё работает)
0
07.06.2016, 16:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2016, 16:50
Привет! Вот еще темы с ответами:

Элементарные операции с динамических двусвязным списком - C++
Всем доброго времени суток! Нужна ваша помощь! В общем задание: Сформировать динамический двусвязный список. Структура содержит...

Разработать программу, которая использует генерацию случайных чисел для создания предложений - C++
Помогите пожалуйста составить программу в С++. Задание такое: &quot;Разработать программу, которая использует генерацию случайных чисел...

Работа с двусвязным нециклическим списком: инверсия списка - C++
Есть программа для работы с двухсвязным списком. Есть проблемы с функцией инверсии списка. Visual C++ выдает следующую ошибку: ...

Работа с двусвязным списком. Проблема с функцией удаления с конца - C++
Есть задача на двусвязный список, но наблюдается непонятная ошибка. Если сделать функцию удаления всех элементов через функцию удаления с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru