ОЧЕНЬ НУЖНА ПОМОЩЬ!!!
Помогите удалить элементы по заданному ключу из однонаправленного списка.
Код:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
/*СТРУКТУРА Книга*/
struct Book
{
char name[50]; //Название книги
char athor[50]; //Фамилия автора
char country[50]; //страна выпуска
int year; //год издания
int price;// цена
void Input(Book &book); //Функция ввода данных в структуру
Book *Next; //Адрес на следующий элемент
};
class List
{
Book *Head; //Указатель на начало списка
public:
List() :Head(NULL){}; //Конструктор по умолчанию (Head=NULL)
~List();//Деструктор
void Add(Book &book);
void Sort();
void Show();
void clear();
void Del();
};
/*ФУНКЦИЯ ЗАПОЛНЕНИЯ ДАННЫХ ПО КНИГЕ*/
void Book::Input(Book &book)
{
cin.ignore(cin.rdbuf()->in_avail());
cout << "Название книги: "; cin.getline(name, 50);
cin.ignore(cin.rdbuf()->in_avail());
cout << "Автор: "; cin.getline(athor, 50);
cin.ignore(std::cin.rdbuf()->in_avail());
cout << "Страна издания: "; cin.getline(country, 50);
cin.ignore(std::cin.rdbuf()->in_avail());
cout << "Цена: "; cin >> price;
cout << "Год: "; cin >> year;
}
List::~List() //Деструктор класса List
{
while (Head != NULL) //Пока по адресу есть хоть что-то
{
Book *temp = Head->Next; //Сразу запоминаем указатель на адрес следующего элемента структуры
delete Head; //Освобождаем память по месту начала списка
Head = temp; //Меняем адрес начала списка
}
}
/*ФУНКЦИЯ ДОБАВЛЕНИЯ НОВОЙ СТРУКТУРЫ В СПИСОК*/
void List::Add(Book &book)
{
Book *temp = new Book; //Выделение памяти под новую структуру
temp->Next = Head; //Указываем, что адрес следующего элемента это начало списка
//Копирование содержимого параметра book в только что созданную переменную
strcpy_s(temp->name, book.name);
strcpy_s(temp->athor, book.athor);
strcpy_s(temp->country, book.country);
temp->year = book.year;
temp->price = book.price;
Head = temp; //Смена адреса начала списка
}
int main()
{
setlocale(LC_ALL, "Russian");
Book book; //Обяъвили переменную, тип которой Книга
int N; //Объявили переменную - число книг
List lst; //Объявили переменную типа Список. Она выступает как контейнер данных
cout << "введите количество книг: "; cin >> N; //Ввели число книг
cin.ignore(); //Игнорируем клавишу Enter
for (int i = 0; i < N; i++)
{
book.Input(book); //Передаем в функцию заполнения переменную книга
lst.Add(book); //Добавляем заполненную структуру в список
}
lst.Show(); //Показываем список на экране
system("PAUSE");
}
/*ФУНКЦИЯ КЛАССА LIST ДЛЯ ВЫВОДА СПИСКА НА ЭКРАН*/
void List::Show()
{
Book *temp = Head; //Объявляем указатель и изначально он указывает на начало
ofstream fout("book.xls", std::ios_base::out);
while (temp != NULL) //Пока по адресу на начало хоть что-то есть
{
//Выводим все элементы структуры
cout << temp->name << " "; //Вывод названия
cout << temp->athor << " "; //Вывод фамилии автора
cout << temp->country << " "; //Вывод страны
cout << temp->year << " "; //Вывод года
cout << temp->price << endl; // Вывод цены
fout << temp->name << "\t"; //Вывод названия
fout << temp->athor << "\t"; //Вывод фамилии автора
fout << temp->country << "\t"; //Вывод страны
fout << temp->year << "\t"; //Вывод года
fout << temp->price << endl;
temp = temp->Next; //Указываем на следующий адрес из списка
}
fout.close();
ifstream fin("book.xls", ios::in);
if (!fin.is_open()) // если файл не открыт
cout << "Файл не может быть открыт!\n"; // сообщить об этом
else
{
cout << "........................................................" << endl;
cout << "Чтение из файла..." << endl;
cout << fin.rdbuf() << endl;
}
fin.close();
}