Так что в моей домашней работе мне нужно отсортировать города по алфавиту по первой букве, если есть еще города с одинаковыми начальными буквами, то вывести их в обратном порядке.
Мне удалось получить входные данные из файла в массив символов буфера.
Но когда я пытаюсь отсортировать его (пройти массив, он не работает)
#include <iostream>
#include <fstream>
using namespace std;
class List
{
struct Node
{
char* input;
Node* next;
};
Node* head;
Node* tail;
public:
List()
{
head = NULL;
tail = NULL;
}
void createnode(char* city)
{
Node* temp = new Node;
temp->input= city;
temp->next = NULL;
if (head == NULL)
{
head = temp;
tail = temp;
}
else
{
Node* point = new Node;
point->input= city;
point->next = head;
head = point;
}
}
void display()
{
Node* point = head;
if (point == NULL)
{
cout << endl << "====================================" << endl << "List Doesnt exist/is deleted" << endl << "====================================" << endl;
return;
}
cout << endl << "your list:" << endl;
while (point != NULL)
{
cout << point->input<< "\t";
point = point->next;
}
cout << endl;
}
};
int main()
{
////////////////THE PART WHERE I EXTRACT INFORMATION FROM THE INPUT FILE
ifstream file("paldies.in", ifstream::binary);
fstream file2;
file2.open("paldies.out", ios::out);
if (!file)
{
cout << "Error desune!";
return 0;
}
file.seekg(0, file.end);
int length = file.tellg();
file.seekg(0, file.beg);
char * buffer = new char[length];
cout << "Reading " << length << " characters....." << endl;
file.read(buffer, length);
if (length == 0)
{
char nothing[8] = "Nothing";
file2.write(reinterpret_cast<char*>(nothing), 8 * sizeof(char));
file.close();
file2.close();
return 0;
}
if (file)
{
cout << "all characters read succesfully.";
}
else
{
cout << "error: only " << file.gcount() << " could be read";
}
file.close();
////////////////////////////THIS IS THE PART THATS NOT WORKING FOR ME
List a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z;
for (buffer; *buffer != '\0'; buffer++)
{
if (buffer[0] == 's')
{
char s_begining[255] = "";
for (int i = 0; buffer[0] != ' '; i++)
{
s_begining[i] = buffer[0];
buffer++;
}
s.createnode(s_benining);
}
buffer++;
}
cout << endl<<buffer<<endl;
s.display();
file2.close();
return 0;
}
Ввод: Спрингфилд, Филадельфия, Детройт, Кливленд, Майами, Денвер, Спрингфилд, Сиэтл, Джексонвилл
Правильный вывод: Кливленд Денвер Детройт Джексонвилл Майами Филадельфия Сиэтл Спрингфилд Спрингфилд
Фактический вывод: так как я просто проверяю букву s, он выступает в качестве пружинного поля только один раз, если я изменю объявление char s_begining за пределы оператора if или цикла, он дает разные результаты.
У меня такое ощущение, что проблема где-то в первом цикле for, потому что, когда я его вынимаю, первый элемент попадает в список просто замечательно, но когда я возвращаюсь, иногда возникает исключение, ничего не происходит (пустой список) , или в списке есть 4 входа с данными мусора.
Также, если я удалю буфер ++; в конце первого цикла for он также разбивает вещи.
До сих пор я правильно получил 1 название города в списке, и это первое (Спрингфилд).
РЕДАКТИРОВАТЬ: я забыл упомянуть, что мне разрешено использовать только библиотеку fstream, все остальное должно быть написано мной!