Задание 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; просмотров: 864;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.03 сек.