Форум программистов, компьютерный форум CyberForum.ru

Сортировка односвязного списка (нужно редактирование) - C++

Восстановить пароль Регистрация
 
dimaMJ
0 / 0 / 0
Регистрация: 04.04.2012
Сообщений: 11
30.04.2012, 21:31     Сортировка односвязного списка (нужно редактирование) #1
нужно вот что - Задание : Сортировка книг данного автора по полю год издания,
то есть, вводишь автора, и он < кто ? />сортирует его книжки по полю год издания.
Это курсовая, я все сделал, кроме сортировки (точнее, сортировку написал, но она не хочет работать). Вот код , большая просьба, скомпилируйте и посмотрите, и подредактируйте, что надо, чтобы сортировка работала. ( А то критическая ситуация ( . Буду благодарен ( .
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
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
// Kursovaya (dima_MJ).cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <string>
#include <iostream>
#include <fstream>
#include <conio.h>
 
using namespace std;
 
struct Book {
  string author;
  string name;
  unsigned int year;
  unsigned int number;
  unsigned int pages;
  Book* next;
 
  Book (unsigned int Number, unsigned int Pages, unsigned int Year, string Name = "unknown", string Author = "unknown") {    // Конструктор
    next = 0;
    if (!Author.empty ()) {
      author = Author;
    }
    else {
      author = "unknown";
    }
    if (!Name.empty ()) {
      name = Name;
    }
    else {
      name = "unknown";
    }
    year = Year;
    number = Number;
    pages = Pages;
  }
};
 
struct Library {
  Book* first;
  
  Library (void) {
    first = 0;
  }
 
  ~Library (void) {
    for (;first != 0;) {
      Book* next = first->next;
      delete first;
      first = next;
    }
  }
 
  void addBook (Book* newBook) {            // Функция добавления эл-тов
    if (first != 0) {
      Book* buffer = first;
      for (;;) {
        if (buffer->next != 0) {
          buffer = buffer->next;
        }
        else {
          buffer->next = newBook;
          break;
        }
      }
    }
    else {
      first = newBook;
    }
  }
 
  void showBooks (unsigned int Pages = 0) {      // Функция вывода на экран
    Book* current = first;
 
      FILE *A;
        if((A=fopen("file.txt","w"))==NULL)
        {
          printf("Error!! 1 not found!");}
        
 
        cout << "\n|Number: " ;
        cout << "  |Author:"  ;
        cout << "           |Name: "   ;
        cout << "                    |Year: "    ;
        cout << "    |Pages: "    ;
 
          cout<<"\n________________________________________________________________________________\n";
 
    while(current != NULL) {
      unsigned int pages = current->pages;
      
      if (pages > Pages)  {
        
        printf("\n|    %-6d| " , current->number);
        printf( "%-17s|" , current->author.c_str() );
        printf( " %-25s|" , current->name.c_str()  );
        printf("   %-7d|"   , current->year );
        printf( "    %-6d|"  , pages      );
        cout<<"\n________________________________________________________________________________\n";
 
 
              fprintf(A,"\n|%-8d|", current->number); 
              fprintf(A,"%-25s|", current->author.c_str());
              fprintf(A,"%-25s|",current->name.c_str());
              fprintf(A,"%-11d|",current->year);
              fprintf(A,"%-11d|",pages);
              fprintf(A,"\n--------------------------------------------------------------------------------------\n",pages);
                            current = current->next;
      
      }
          
 
    }
      fclose(A);
    
    _getch ();
 
 
  }
  
  
 
  void showYear (unsigned int Year = 0)            // Функция вывода по заданому году
  {
    Book* current = first;
    cout<<"________________________________________________________________________________";
      cout << "\n|Number: " ;
        cout << "  |Author:"  ;
        cout << "           |Name: "   ;
        cout << "                    |Year: "    ;
        cout << "    |Pages: "    ;
 
          cout<<"\n________________________________________________________________________________\n";
    for (;current != 0;) {
      unsigned int year = current->year;
      if ((year == Year || Year == 0)) {
        printf("\n|    %-6d| " , current->number);
        printf( "%-17s|" , current->author.c_str() );
        printf( " %-25s|" , current->name.c_str()  );
        printf("   %-7d|"   , year );
        printf( "    %-6d|"  , current->pages      );
        cout<<"\n________________________________________________________________________________\n";
      }  
      current = current->next;
  }
    _getch ();
  }
 
  void deleteBooksByAuthor (string author) {            // Фурнкция удаления книжек заданого автора 
    Book* current = first;
    Book* prefered = first;
    for (;current != 0;) {
      if (current->author.compare (author) == 0) {
        if (prefered != current) {
          prefered->next = current->next;
        }
        else {
          prefered = current->next;
          first = current->next;
        }
        delete current;
        current = prefered;
      }
      else {
        prefered = current;
        current = current->next;
      }
    }
  }
 
 
    
  void Library::sortByYear(  )  {            // Функция сотрировки по году!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
 
    Book * begin = first; //Начало очереди
Book * current = first; //Текущая позиция в очереди
Book * sled = NULL; //Следующий элемент очереди
char avtor[25]; //Переменная хранящая имя автора
cout<<"Enter name avtor: ";
cin>>avtor;
 
while(current) //Цикл сортировки очереди
{
sled = current->next; //Следующий элемент очереди
while (sled)
{
  if (sled->author.c_str()==avtor) 
{
if (sled->year> current->year)
{
Book * tmp = sled;
sled = current;
current = tmp;
}
}
sled = sled->next; //Переход на следующий элемент очереди
}
current = current->next; //Переход на следующий элемент очереди
}
  } 
};
 
 
 
 
void menuAddBook (Library* library) {            // Меню - Добавление элементов
  int n;
 
  FILE *B;
        if((B=fopen("fileb.txt","a+"))==NULL)
        {
          printf("Error!! 1 not found!");}
        
 
    cout<<"Enter kol-vo vodimih khig: ";
    cin>>n;
    cout<<"--------------------------"<<endl;
 
  for(int i=0;i<n;i++)
  {
  cout << "Enter Number: ";
  unsigned int number;
  cin >> number;
  string author = "unknown";
  cout << "Enter Author: ";
  cin>>author;
  cout << "Enter Name: ";
  string name;
  cin >> name;
  cout << "Enter Year: ";
  unsigned int year;
  cin >> year;
  cout << "Enter Pages: ";
  unsigned int pages;
  cin >> pages;
  cout<<"========================="<<endl;
  Book* newBook = new Book (number, pages, year, name, author);
  library->addBook (newBook);
 
        fprintf(B,"\n|%-8d|", number); 
              fprintf(B,"%-25s|", author.c_str());
              fprintf(B,"%-25s|",name.c_str());
              fprintf(B,"%-11d|",year);
              fprintf(B,"%-11d|",pages);
              fprintf(B,"\n--------------------------------------------------------------------------------------\n",pages);      
                           
  }
 
}
 
void menuShowAllBooks (Library* library) {          // Меню - Вывод на экран
  library->showBooks ();
}
 
void menuDeleteBooksByAuthor (Library* library) {        // Меню - Удаление книжек заданого автора
  cout << "Enter author: ";
  string author;
  cin >> author;
  cout<<"--------------------------"<<endl;
  library->deleteBooksByAuthor (author);
}
 
void menuShowBooksByPages (Library* library) {      // Меню - Вывод книжек с кол-вом страниц больше заданных 
  cout << "Enter number of pages: ";
  unsigned int pages;
  cin >> pages;
  cout<<"--------------------------"<<endl;
  library->showBooks (pages);
}
 
void menuShowBooksByYear (Library* library) {        // Меню - Вывод по заданому году 
  cout << "Enter year: ";
  unsigned int year;
  cin >> year;
  library->showYear (year);
}
 
void menuShowBooksSortedByYear (Library* library) {        // Меню - Сортировка по году 
  
  library->sortByYear ();
}
 
void menuExit (Library* library) {                // Меню - Выход и удаление 
  cout << "Thank's for using.";
  _getch ();
  delete library;
  exit (0);
}
 
int main (void) {
  Library* library = new Library ();
 
  Book* book1 = new  Book (1,352,1837,"Evgeniy Onegin","Pushkin");
  Book* book2 = new  Book (2,144,1825,"Boris Godunov","Pushkin");
  Book* book3 = new  Book (3,167,1840,"Geroy nashego vremeni","Lermontov");
  Book* book4 = new  Book (4,208,1835,"Maskarad","Lermontov");
 
  library->addBook(book1);
  library->addBook(book2);
  library->addBook(book3);
  library->addBook(book4);
 
  while (true) {
  int m=0;
  system ("cls");  //*Очистка экрана*//
  cout<<"Function 1: dobavlenie el-tov"<<"                                         "<<"Enter - 1"<<endl;
  cout<<"Function 2: nachalnoe formirovanie dan-h o vseh knigah"<<"                "<<"Enter - 2"<<endl;
  cout<<"Function 3: ydalenie dan-h o knigah zadan-h avtorov "<<"                  "<<"Enter - 3"<<endl;
  cout<<"Function 4: vidacha dan-h o knigah s zadan-m godom izdaniya "<<"          "<<"Enter - 4"<<endl;
  cout<<"Function 5: sortirovka knig danogo avtora po polyu god izdaniya "<<"      "<<"Enter - 5"<<endl;
  cout<<"Function 6: poisk knig s kol-vom stranic > zadan-h "<<"                   "<<"Enter - 6"<<endl;
  cout<<"!Exit!"<<"                                                                "<<"Enter - 0"<<endl;
  cout<<"--------------------------------------------------------------------------------";
 
  cin>>m;
  cout<<"--------------------------------------------------------------------------------";
 
    switch(m)
    {
      case 1 : menuAddBook (library); break;
      case 2 : menuShowAllBooks (library); break;
      case 3 : menuDeleteBooksByAuthor (library); break;
      case 4:  menuShowBooksByYear (library);break;
      case 5 : menuShowBooksSortedByYear (library); break;
      case 6 : menuShowBooksByPages (library); break;
      case 0 : menuExit (library); break;
      default: cout<<"!Error! - Enter numbers 0-6!";
    }
  }
 
}
Добавлено через 3 часа 4 минуты
Ребята, помогите, пожалуйста, с сортировкой ( мне в Чт сдать надо, ( я уже эту сортировку третий пишу, никак ( не идет ( . Помогите, пожалуйста.

 Комментарий модератора 
Правила
п.2.7. Избегайте грамматических ошибок при написании сообщений - уважайте себя и других участников форума.
Как вы думаете учиться программированию, если даже знаки препинания осилить не можете?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.04.2012, 21:31     Сортировка односвязного списка (нужно редактирование)
Посмотрите здесь:

[C++]сортировка односвязного списка C++
C++ Сортировка односвязного списка
C++ сортировка односвязного списка
Сортировка односвязного циклического списка (Прямым включением) C++
Сортировка односвязного списка (2 метода) C++
Сортировка односвязного списка пузырьком C++
C++ Сортировка односвязного списка
Не работает сортировка для односвязного списка C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
01.05.2012, 03:41     Сортировка односвязного списка (нужно редактирование) #2
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
void swap(Book* x, Book* y)
{
    string strtmp;
    unsigned int inttmp;
    strtmp = x->author;
    x->author = y->author;
    y->author = strtmp;
    strtmp = x->name;
    x->name = y->name;
    y->name = strtmp;
    inttmp = x->year;
    x->year = y->year;
    y->year = inttmp;
    inttmp = x->number;
    x->number = y->number;
    y->number = inttmp;
    inttmp = x->pages;
    x->pages = y->pages;
    y->pages = inttmp;
}
void sortByYear()    
{                       // Сортировка пузырьком
 
    Book * begin = first; //Начало очереди
    Book * current = first; //Текущая позиция в очереди
    char avtor[25]; //Переменная хранящая имя автора
    cout<<"Enter name avtor: ";
    cin>>avtor;
    for(current = first; current!=0; current = current->next)
        if(current->author==avtor)
            for(Book * current2 = current; current2!=0; current2=current2->next)
                if(current2->author==avtor)
                    if(current->year>current2->year)
                        swap(current,current2); // меняем местами
};
Вы меняли местами книги в списке, забыв об указателях. Нужно либо менять элементы списка местами и не забывать об указателях next, которые идут НА обмениваемые элементы, либо просто менять местами информационные поля, как сделал я в функции swap. Сделал я все по-тупому, за пару минут так что проверьте, но вроде работает. Было бы неплохо создать структуру data, а в неё уже поместить все информационные поля:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct Book {
   Data* inf;
    Book* next;
    ...
};
struct Data
{
    string author;
    string name;
    unsigned int year;
    unsigned int number;
    unsigned int pages;
};
Тогда проще будет менять местами поля.
Yandex
Объявления
01.05.2012, 03:41     Сортировка односвязного списка (нужно редактирование)
Ответ Создать тему
Опции темы

Текущее время: 08:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru