Задание 2. Динамический список
Пример. Ввести структуру СТУДЕНТ с полями ФАМИЛИЯ, ОЦЕНКА. Решить задачу, используя динамическую структуру однонаправленного списка. Составить и протестировать функции: создания списка на основе данных из файла, записи данных из списка в файл, добавления элемента в начало (конец) списка, удаления всего списка, вывода всего списка данных на экран в виде таблицы, удаления всех студентов, имеющих заданную оценку.
#include <iostream.h>
#include <string.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
# include <iomanip.h>
# define dlin 20
struct student
{
char *fio;
int mark;
student *next;
}* begin=NULL;
//----Функция создания списка на основе данных из файла----
//Предполагается, что фамилии и оценки студентов в файле
//введены на разных строках
void vvod ()
{
char filename[50];
cout<< “Введите имя файла”;
cin>>filename;
FILE *fp= fopen(filename,"r");
if (fp!=NULL)
{
student *adr;
char f[dlin];
while(feof(fp)==0)
{
fgets(f, dlin, fp);
int l=strlen(f);
if (f[l-1]=='\n') f[l-1]='\0';
adr=new(student);
adr->fio=new (char [l+1]);
strcpy(adr->fio,f);
fscanf (fp, "%d ", &(adr->mark));
adr->next=begin;
begin=adr;
}
cout<<"Список создан";
}
else cout<<"Файла не существует";
}
//----------Функция вывода данных из файла на экран------
void vivod()
{
if (begin)
{
student *adr;
cout.setf(ios::left);
//Вывод шапки талицы
cout<<"\n"<<setw(dlin+13)<<setfill('-')<<" ";
cout<<setfill(' ')<<"\n| # "<<setw(dlin+2)<<"| FIO"<<"|Mark"<<"|";
cout<<"\n"<<setw(dlin+13)<<setfill('-')<<" ";
adr=begin;
int k=1;
while (adr!=NULL) //Вывод списка
{
cout<<setfill(' ')<<"\n| "<<setw(3)<<k<<"| "<<setw(dlin)<<(adr->fio)<<"| "<<setw(3)<<adr->mark<<"|";
cout<<"\n"<<setw(dlin+13)<<setfill('-')<<" ";
adr=adr->next;
k++;
}
}
else cout<<"Списка не существует";
}
//-----------Функция вывода списка в файл ----------
//Фамилия и оценка студента выводятся на разные строки файла
void vivod_f()
{
if (begin)
{
char filename[50];
cout<< “Введите имя файла”;
cin>>filename;
FILE *fp= fopen(filename,"w");
if (fp)
{
student *adr;
adr=begin;
while (adr!=NULL)
{
fputs(adr->fio, fp);
fputc('\n',fp);
fprintf (fp,"%d",adr->mark);
fputc('\n',fp);
adr=adr->next;
}
fclose (fp);
}
else cout<<"Запись невозможна";
}
else cout<<"Списка не существует";
}
//-----------Функция добавления элемента в список ---------
void add()
{
student *adr;
char f[dlin];
adr=begin;
begin=new(student);
cout<<"\nEnter fio ";
gets(f);
begin->fio=new (char [strlen(f)+1]);
strcpy(begin->fio,f);
cout<<"\nEnter mark ";
cin>> begin->mark;
begin->next=adr;
}
//-----Функция удаления студентов, с заданной оценкой------
void udol () //
{
if (begin)
{
int k;
cout<<"\nEnter mark ";
cin>>k;
student *adr;
//удаление найденных студентов из головы списка
while (k==begin->mark)
{
cout<<begin->fio<<" udal \n";
adr = begin;
begin=begin->next;
delete adr;
}
student *a;
adr=begin;
//удаление найденных студентов из головы списка
while (adr->next!=NULL)
{
if (k==adr->next->mark)
{
cout<<adr->next->fio<<" udal \n";
a=adr->next;
adr->next=adr->next->next;
delete a;
}
else adr=adr->next;
}
}
else cout<<"Списка не существует";
}
//-----------Функция удаления списка ----------
void del()
{
student *adr;
while (begin)
{
adr=begin;
begin=begin->next;
delete adr;
}
cout<<"\nСписок удален";
}
void main ()
{
N:
clrscr();
cout<< "Введите номер функции\n";
cout<<" 1 – Создание списка из файла\n";
cout<<" 2 – Вывод списка на экран\n";
cout<<" 3 – Вывод списка в файл\n";
cout<<" 4 – Добавление студента в список\n";
cout<<" 5 – Удаление студентов с заданной фамилией\n";
cout<<" 6 – Удаление списка \n";
cout<<" 0 – Выход из программы \n";
int nom;
cin>>nom;
switch (nom)
{
case 0: {del();exit(0);}
case 1: {vvod(); break;}
case 2: {vivod (); break;}
case 3: {vivod_f(); break;}
case 4: {add(); break;}
case 5: {udol(); break;}
case 6: {udol(); break;}
default: cout<<"Ошибка ввода ";
}
cout<<"\nДля продолжение нажмите Enter "; getch();
goto N;
}
Решить следующие задачи, используя динамическую структуру списка (однонаправленного или двунаправленного). В каждой из перечисленных ниже задач необходимо составить функции:
- создания списка на основе данных из файла,
- записи данных из списка в файл,
- добавления элемента в начало (конец) списка,
- удаления всего списка,
- вывода всего списка данных на экран в виде таблицы.
1. Ввести структуру АВТОМАШИНА с полями МАРКА, ГОД ВЫПУСКА, НОМЕР, ФАМИЛИЯ ВЛАДЕЛЬЦА. Составить функцию поиска машины по любой из комбинации признаков.
2. Ввести структуру АВТОМАШИНА с полями МАРКА, ГОД ВЫПУСКА, НОМЕР, ФАМИЛИЯ ВЛАДЕЛЬЦА. Составить функцию поиска всех владельцев машин, имеющих более одной машины и вывода полной информации об их машинах.
3. Ввести структуру ИСТОРИЧЕСКОЕ СОБЫТИЕ с полями ЧИСЛО, МЕСЯЦ, ГОД, СОБЫТИЕ. Составить и протестировать функцию
a) сортирующую список исторических событий по дате (год, месяц, число);
b) добавляющее новое событие в отсортированный по датам события список в нужное место.
4. Ввести структуру ИСТОРИЧЕСКОЕ СОБЫТИЕ с полями ГОД, СОБЫТИЕ. Составить функцию
a) вычисляющую в каком году произошло больше всего событий;
b) формирующую новый список из событий, произошедших в этом году.
5. Ввести структуру ИСТОРИЧЕСКОЕ СОБЫТИЕ с полями ГОД, СОБЫТИЕ. Составить функцию
a) сортирующую список исторических событий по полю ГОД;
b) подсчитывающую средний интервал между датами.
6. Ввести структуру СТУДЕНТ с полями ФИО, ЧИСЛО, МЕСЯЦ, ГОД РОЖДЕНИЯ, НОМЕР ГРУППЫ. Составить функцию
a) удаляющую всех студентов из заданной группы,
b) сортирующую список студентов по возрасту.
7. Ввести структуру УЧЕНИК с полями ФИО, ГОД РОЖДЕНИЯ, НОМЕР КЛАССА. Составить функцию
a) сортирующую список студентов по алфавиту
b) добавляющего нового студента в алфавитном порядке
8. Ввести структуру ЭКСПОРТИРУЕМЫЙ ТОВАР с полями НАИМЕНОВАНИЕ ТОВАРА, СТРАНА (импортирующая товар), ОБЪЕМ ПАРТИИ (в штуках). Составить функцию
a) сортирующая список товаров по полю СТРАНА;
b) увеличивающую объем партий на n % для стран, импортирующих более k наименований товара.
9. Ввести структуру УЧЕНИК с полями ФИО, ГОД ОБУЧЕНИЯ, НАЗВАНИЯ КЛАССА (БУКВА). Составить функцию
a) сортирующую список учеников по классам;
b) проверяющую, чтобы в каждом классе было не более n учеников (если количество учеников в классе больше n, то в этом классе оставляется только n учеников, а из остальных формируется новый класс с буквой, следующей по алфавиту за имеющимися).
10. Ввести структуру УЧЕНИК с полями ФИО, ГОД ОБУЧЕНИЯ, НАЗВАНИЯ КЛАССА (БУКВА), ИТОГОВАЯ ОЦЕНКА. Составить функцию
a) сортирующую список учеников по классам;
b) подсчитывающего среднюю оценку для каждого класса.
11. Ввести структуру КНИГА с полями НАЗВАНИЕ, ФИО АВТОРА, ГОД ИЗДАНИЯ, КОЛИЧЕСТВО ЭКЗЕМПЛЯРОВ. Составить функцию
a) подсчитывающую общее количество книг,
b) вычисляющее в какой год было издано больше всего книг (по наименованию, а не по количеству экземпляров)
12. Ввести структуру КНИГА с полями НАЗВАНИЕ, ФИО АВТОРА, ГОД ИЗДАНИЯ, КОЛИЧЕСТВО ЭКЗЕМПЛЯРОВ. Составить функцию
a) удаляющую все книги, изданные ранее заданного года;
b) формирующую новый список из книг заданного автора.
Дата добавления: 2015-10-09; просмотров: 917;