Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие С++- не книжкой_новое.doc
Скачиваний:
4
Добавлен:
04.11.2018
Размер:
765.44 Кб
Скачать

Задание 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<<"Списка не существует";

}

//-----------Функция удаления списка ----------