Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 17.04.2012
Сообщений: 10
1

Задача про сортировку с использованием связного списка, нужно найти ошибку

24.11.2012, 12:11. Просмотров 981. Ответов 10

Имеется файл состоящий из данных о студентах(ФИО, номер группы, средний бал). Построить сортированный список(по имени хотя бы) по любому из параметров. Написал программу, должна по сути вывести в другой файл сортированный список по имени. Синтаксических ошибок нет, не компилируется

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
#include "stdafx.h"
#include <iostream>
#include <fstream>
 
using namespace std;
 
struct Person
{
Person* CurrPer;
char name[20], secname[20], fname[20];
int numgr;
double score;
Person* next;
Person* prev;
 
};
class Group
{
int i,j,n;
public:
Person* Input(Person* CurrPer);
void Output(Person* CurrPer);
Person SortName(Person* CurrPer);
Person* first, tmp;
 
 
};
 
 
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL,"Rus");
Person* CurrPer=new Person; //выделили память под 1й элемент
Group Gruppa;
CurrPer=Gruppa.Input(CurrPer);
Gruppa.SortName(CurrPer);
Gruppa.Output(CurrPer);
return 0;
}
 
Person* Group::Input(Person* CurrPer)
{
 
 
Person* first=CurrPer; //отдельно сохранили адрес первого элемента, чтобы иметь возможность к нему обращаться
CurrPer->prev=0; //показываем, что это первый элемент, и перед ним больше нет элементов
int n=0;
ifstream in ("1.txt"); //открыли файл на считывание
in>>CurrPer->name>>CurrPer->secname>>CurrPer->fname>>CurrPer->numgr>>CurrPer->score; //считали информацию о первом студенте
while(!in.eof()) //пока не достигнут конец файла
{
CurrPer->next=new Person; //выделили память под i-й элемент типа person и сохранили его адрес в i-1 элементе
CurrPer->next->prev=CurrPer; //в i-й элемент в переменную prev записали адрес i-1 элемента
CurrPer=CurrPer->next; //перешли от i-1 элемента к i-му
 
in>>CurrPer->name>>CurrPer->secname>>CurrPer->fname>>CurrPer->numgr>>CurrPer->score; //считали информацию о i-м студенте
n++; //считаем количество элементов
}
CurrPer->next=0; //у последнего элемента сделали указатель на следующий - 0, чтобы было понятно, что это конец списка
in.close();
return CurrPer;
};
 
void Group::Output(Person* CurrPer)
{
ofstream output("2.txt");
if(!CurrPer)
cout<<"\nВ списке отсутствуют элементы";
else
while(CurrPer)
{
output<<CurrPer->name<<"\t"<<CurrPer->secname<<"\t"<<CurrPer->fname<<"\t"<<CurrPer->numgr<<"\t"<<CurrPer->score<<"\t"<<endl;
CurrPer=CurrPer->next;
}
};
 
Person Group::SortName(Person* CurrPer)
{
 
for(i=0;i<n;i++)
{
CurrPer=first;
for(j=0;j<n-i-1;j++)
{
if(strcmp(CurrPer->name,CurrPer->next->name)==1)
{
 
tmp=*CurrPer;
strcpy_s(CurrPer->name,CurrPer->next->name);
strcpy_s(CurrPer->secname,CurrPer->next->secname);
strcpy_s(CurrPer->fname,CurrPer->next->fname);
CurrPer->numgr=CurrPer->next->numgr;
CurrPer->score=CurrPer->next->score;
 
 
CurrPer=CurrPer->next;
 
strcpy_s(CurrPer->name,tmp.name);
strcpy_s(CurrPer->secname,tmp.secname);
strcpy_s(CurrPer->fname,tmp.name);
CurrPer->numgr=tmp.numgr;
CurrPer->score=tmp.score;
 
}
else CurrPer=CurrPer->next;
}
}
cout<<first;
return *first;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.11.2012, 12:11
Ответы с готовыми решениями:

Построить бинарное дерево с использованием связного списка
Построить бинарное дерево с использованием связного списка. Элементы дерева принимают значения...

linkedlist нужно сделать копирование связного списка
classProgram { staticvoid Main(string args) { LinkedList&lt;string&gt; linkedList =...

Задача про треугольник. Найти ошибку
Условие: ввести 3 числа, если они могут быть длинами сторон прямоугольного треугольника, вывести их...

Найти ошибку в задаче на файловый ввод/вывод (задача про МКАД)
Длина Московской кольцевой автомобильной дороги —109 километров. Байкер Вася стартует с первого...

10
3299 / 2680 / 724
Регистрация: 25.03.2012
Сообщений: 9,683
Записей в блоге: 1
24.11.2012, 12:33 2
а тебя не учили, что при сортировке связанного списка НЕ НАДО копировать данные из элемента в элемент?
НАДО лишь менять местами указатели так, чтоб последовательность изменилась

было el1-->el2-->el3-->el4

..................|----------v
стало el1...el2<--el3 ...el4
...........|________^

Ты хоть понимаешь, что strcpy копирует строки посимвольно в цикле? Я б за такую сортировку списка на второй год оставлял бы в школе.
0
0 / 0 / 0
Регистрация: 17.04.2012
Сообщений: 10
24.11.2012, 12:37  [ТС] 3
Учить некому))) что надо изменить в коде???
0
3299 / 2680 / 724
Регистрация: 25.03.2012
Сообщений: 9,683
Записей в блоге: 1
24.11.2012, 13:17 4
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
 /*Èçìåíèòü? Ñëåäóåò âîîáùå îòêàçàòüñÿ îò êîïèðîâàíèÿ ñòðîê, è ðàáîòàòü òîëüêî ñ óêàçàòåëÿìè íà ñòðóêòóðû.
óêàçàòåëè æå ïðîùå!
Åñëè áû ýòî áûë ñïèñîê ñòðóêòóð ðàçìåðîì â ïàðó áàéò, áûë áû åù¸ ñìûñë.
 Íî òóò ñàìî çàäàíèå íàìåêàåò, ÷òî íàäî òåáå ó÷èòüñÿ ïåðåñòàâëÿòü óêàçàòåëè â ñïèñêå íà ýòîì ïðèìåðå.
*/
Person Group::SortName()
{
       bool sorted=false;
       Person* current;
       Person* tmp;
       while (!sorted){
             sorted=true;
             current=first;
             while(current->next){
                   if(strcmp(current->name,current->next->name)>0){
                         sorted=false;
                         //deleting Current
                         if (current->prev) current->prev->next=current->next;
                                                    current->next->prev=current->prev;
                         //inserting Current after current->next;
                                                   current->prev=current->next;
                                                   current->next=current->prev->next;
                                                   current->next->prev=current;
                                                   current->prev->next=current;
                   }
                   else
                        current=current->next;
             }
     }
 
}
0
0 / 0 / 0
Регистрация: 17.04.2012
Сообщений: 10
06.12.2012, 15:18  [ТС] 5
вот полная задача, помоги решить ааа!!! не компилируется она у меняяя... в универе не учат,сам разобраться не как не могу, вся надежда на тебя!!

Имеется файл, состоящий из данных о студентах (фамилия, имя, номер группы, средний балл).
Построить сортированный список студентов. Сортировка задается по одному из параметров.

2.1
Реализовать данные в виде массива структур. Применить быструю сортировку (по среднему
баллу).

2.2

Реализовать те же данные в виде списка (дополнительные баллы).

Добавлено через 23 минуты
Kuzia domovenok, помоги!!
0
0 / 0 / 0
Регистрация: 17.04.2012
Сообщений: 10
07.12.2012, 19:37  [ТС] 6
Kuzia domovenok, почему в твоей функции сортировки меняются местами current->prev и current->next??
C++
1
2
3
4
5
6
7
if (current->prev) current->prev->next=current->next;
                                                    current->next->prev=current->prev;
                         //inserting Current after current->next;
                                                   current->prev=current->next;
                                                   current->next=current->prev->next;
                                                   current->next->prev=current;
                                                   current->prev->next=current;
чет ваще не врубаюсь))
0
3299 / 2680 / 724
Регистрация: 25.03.2012
Сообщений: 9,683
Записей в блоге: 1
07.12.2012, 20:35 7
меняются местами только бывшие current и current->next
в сообщении 2 нарисовано как
0
0 / 0 / 0
Регистрация: 17.04.2012
Сообщений: 10
07.12.2012, 20:48  [ТС] 8
Kuzia domovenok,
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
#include "stdafx.h"
#include <iostream>
#include <fstream>
 
using namespace std;
 
struct Person
{
Person* CurrPer;
char name[20], secname[20], fname[20];
int numgr;
double score;
Person* next;
Person* prev;
 
};
class Group
{
 
public:
    int i,j,n;
Person* Input(Person* current);
void Output(Person* current);
Person* SortName(Person* current);
Person* SortSecName(Person* current);
Person* SortFName(Person* current);
Person* SortNumGroup(Person* current);
Person* SortScore(Person* current);
Person* first, tmp;
 
 
};
 
 
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL,"Rus");
int Num;
Person* CurrPer=new Person; //выделили память под 1й элемент
Group Gruppa;
CurrPer=Gruppa.Input(CurrPer);
//cout<<CurrPer->name<<" "<<CurrPer->secname<<" "<<CurrPer->fname<<" "<<CurrPer->numgr<<" "<<CurrPer->score<<endl;
cout<<"1 - сортировка по имени"<<endl<<"2 - сортировка по фамилии"<<endl<<"3 - сортировка по отчеству"<<endl<<"4 - сортировка по номеру группы"<<endl<<"5 - сортировка по среднему баллу"<<endl;
cin>>Num;
if(Num==1) Gruppa.SortName(CurrPer);
 
if(Num==2) Gruppa.SortSecName(CurrPer);
 
if(Num==3) Gruppa.SortFName(CurrPer);
 
if(Num==4) Gruppa.SortNumGroup(CurrPer);
//
//if(Num==5) Gruppa.SortScore(CurrPer);
 
Gruppa.Output(CurrPer);
return 0;
}
 
Person* Group::Input(Person* current)
{
Person* first=current; //отдельно сохранили адрес первого элемента, чтобы иметь возможность к нему обращаться
current->prev=0; //показываем, что это первый элемент, и перед ним больше нет элементов
int n=0;
ifstream in ("1.txt"); //открыли файл на считывание
in>>current->name>>current->secname>>current->fname>>current->numgr>>current->score;//считали информацию о первом студенте
n=1;
while(!in.eof()) //пока не достигнут конец файла
{
current->next=new Person; //выделили память под i-й элемент типа person и сохранили его адрес в i-1 элементе
current->next->prev=current; //в i-й элемент в переменную prev записали адрес i-1 элемента
current=current->next; //перешли от i-1 элемента к i-му
in>>current->name>>current->secname>>current->fname>>current->numgr>>current->score;//считали информацию о i-м студенте
 
n++; //считаем количество элементов
}
current->next=0;//у последнего элемента сделали указатель на следующий - 0, чтобы было понятно, что это конец списка
current=first;
while(current) {
    cout<<"#"<<n<<"\t"<<current->name<<"\t"<<current->secname<<"\t"<<current->fname<<"\t"<<current->numgr<<"\t"<<current->score<<"\t"<<endl;
    current=current->next;
}
in.close();
return current;
};
 
void Group::Output(Person* current)
{
ofstream output("2.txt");
if(!current)
cout<<"\nВ списке отсутствуют элементы";
else
while(current)
{
output<<current->name<<"\t"<<current->secname<<"\t"<<current->fname<<"\t"<<current->numgr<<"\t"<<current->score<<"\t"<<endl;
 
current=current->next;
}
};
 
Person* Group::SortName(Person* current)
{
      
    bool sorted=false;
      /* Person* current;*/
       /*Person* tmp;*/
       while (!sorted){
             sorted=true;
             current=first;
             while(current->next){
                   if(strcmp(current->name,current->next->name)>0){
                         sorted=false;
                         //deleting Current
                         if (current->prev) current->prev->next=current->next;
                                                    current->next->prev=current->prev;
                         //inserting Current after current->next;
                                                   current->prev=current->next;
                                                   current->next=current->prev->next;
                                                   current->next->prev=current;
                                                   current->prev->next=current;
                   }
                   else
                        current=current->next;
             }
     }
ofstream output("2.txt");
while(current)
{
    cout<<current->name<<"\t"<<current->secname<<"\t"<<current->fname<<"\t"<<current->numgr<<"\t"<<current->score<<"\t"<<endl;
    current=current->next;
}
return current;
}
Person* Group::SortSecName(Person* current)
{
       bool sorted=false;
      /* Person* current;*/
       /*Person* tmp;*/
       while (!sorted){
             sorted=true;
             current=first;
             while(current->next){
                   if(strcmp(current->secname,current->next->secname)>0){
                         sorted=false;
                         //deleting Current
                         if (current->prev) current->prev->next=current->next;
                                                    current->next->prev=current->prev;
                         //inserting Current after current->next;
                                                   current->prev=current->next;
                                                   current->next=current->prev->next;
                                                   current->next->prev=current;
                                                   current->prev->next=current;
                   }
                   else
                        current=current->next;
             }
     }
return current;
}
Person* Group::SortFName(Person* current)
{
       bool sorted=false;
      /* Person* current;*/
       /*Person* tmp;*/
       while (!sorted){
             sorted=true;
             current=first;
             while(current->next){
                   if(strcmp(current->fname,current->next->fname)>0){
                         sorted=false;
                         //deleting Current
                         if (current->prev) current->prev->next=current->next;
                                                    current->next->prev=current->prev;
                         //inserting Current after current->next;
                                                   current->prev=current->next;
                                                   current->next=current->prev->next;
                                                   current->next->prev=current;
                                                   current->prev->next=current;
                   }
                   else
                        current=current->next;
             }
     }
return current;
}
Person* Group::SortNumGroup(Person* current)
{
       bool sorted=false;
      /* Person* current;*/
       /*Person* tmp;*/
       while (!sorted){
             sorted=true;
             current=first;
             while(current->next){
                   if(current->numgr>=current->next->numgr){
                         sorted=false;
                         //deleting Current
                         if (current->prev) current->prev->next=current->next;
                                                    current->next->prev=current->prev;
                         //inserting Current after current->next;
                                                   current->prev=current->next;
                                                   current->next=current->prev->next;
                                                   current->next->prev=current;
                                                   current->prev->next=current;
                   }
                   else
                        current=current->next;
             }
     }
return current;
}
вот прога не робит
0
0 / 0 / 0
Регистрация: 17.04.2012
Сообщений: 10
07.12.2012, 20:49  [ТС] 9
вот это вылезает
0
Миниатюры
Задача про сортировку с использованием связного списка, нужно найти ошибку  
3299 / 2680 / 724
Регистрация: 25.03.2012
Сообщений: 9,683
Записей в блоге: 1
07.12.2012, 22:51 10
а файлик можно?
0
0 / 0 / 0
Регистрация: 17.04.2012
Сообщений: 10
07.12.2012, 23:00  [ТС] 11
ну там ничего особенного просто тупо набрал))
0
Вложения
Тип файла: txt 1.txt (67 байт, 9 просмотров)
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.12.2012, 23:00

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

Задача про сортировку слиянием
Помогите, пожалуйста! Изучаю алгоритмы программирования, сейчас на тема сортировки, конкретнее -...

Задача про матрицу и сортировку массива
Помогите пожалуйста решить задачу : Дана квадратная матрица. Получить одномерный массив...

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

Самая простая задача на свете про сортировку
Супер простая задача на сортировку. Дается N чисел (N ≤ 10^6), которые по абсолютной величине не...

Задача про сортировку массива и его вывод
Помогите пожалуйста решить задачку : Дана квадратная матрица 4х4. Сделать одномерный массив,...

Задача на сортировку списка по убыванию
Теперь надо создать функцию sorted2(data, key), способную сортировать вложенные списки, содержащие...


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

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

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