
- •2013 Г. Цель работы
- •Уточнение задания
- •Описание информационной структуры
- •Описание структуры, используемой для организации списка
- •Контрольные примеры
- •Описание переменных главной функции
- •Краткое описание алгоритма
- •Описание функций Описание функции «enter»
- •Описание функции «Output»
- •Описание функции «confirming»
- •Описание функции «Sort»
- •Описание функции «Newsort»
- •Описание функции «Add»
- •Описание функции «Del»
- •Описание функции «Output_2»
- •Код программы на языке c
- •Результаты выполнения программы
Код программы на языке c
#include "stdafx.h"
#include "stdio.h"
#include <conio.h>
#include <stdlib.h>
#include <tchar.h>
#include <string.h>
#include <locale>
typedef struct games
{
char name[12]; //Название продукта
int year; //Дата выхода
int rating;//Рейтинг
}MS;
typedef struct list
{
MS info;
struct list* next;
}SP;
SP* enter(SP*); //ввод данных
void Output(SP*,char*); //вывод данных
SP *confirming(SP*);
SP *Sort(SP*);
SP *NewSort(SP*,int,int);
SP *Add(SP*);
SP *Del(SP*);
void Output_2(SP*);
SP *Free(SP*);
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_CTYPE, "russian");
SP*h1=NULL,*rez=NULL;
int pm,pm2;
char c=NULL,ch=NULL;
do
{
system("cls");
puts("******************MAIN MENU*********************");
puts("1 - Ввод данных\n");
puts("2 - Вывод списка\n");
puts("3 - Формирование нового списка\n");
puts("4 - Добавление элемента в список \n");
puts("5 - Удаление элемента из списка\n");
puts("6 - Сортировка\n");
puts("7 - Вывод слева и справа от заданного элемента\n");
puts("0 - Выход из программы \n");
fflush(stdin);
scanf("%d",&pm);
switch(pm)
{
case 1:
if(h1==NULL)
{
while(h1!=NULL)
h1=Free(h1);
while(ch!='y')
{
h1=enter(h1);
puts("\n Закончить ввод данных? (y/n)?\n");
ch=getch();
}
}
else
puts("Вы уже вводили данные!Используйте пункты добавление элементов\n");
getch();
break;
case 2:
if(h1!=NULL)
Output(h1,"Список:");
else
puts("Список пуст\n");
getch();
break;
case 3:
if(h1!=NULL)
{
while(rez!=NULL)
rez=Free(rez);
rez=confirming(h1);
if(rez!=NULL)
Output(rez,"Результат обработки:");
else
puts("В списке нет элементов с заданным условием \n");
getch();
}
else
puts("Обработка невозможна - список пуст.\n");
getch();
break;
case 4:
if(h1!=NULL)
h1=Add(h1);
else
puts("Добавление элементов невозможно т.к. список пуст\n");
getch();
break;
case 5:
if (h1!=NULL)
h1=Del(h1);
else
puts("Удаление невозможно.список пуст.\n");
getch();
break;
case 6:
if (h1!=NULL)
h1=Sort(h1);
else
puts("Сортировка невозможно ,список пуст.\n");
getch();
break;
case 7:
if (h1!=NULL)
Output_2(h1);
else
puts("Список пуст \n");
getch();
break;
case 0:
puts("Выполнение программы завершено");
c='y';
break;
default:
puts("Ошибка ввода пункта меню");
getch();
break;
}
}
while(c!='y');
return 0;
}
//***************************************************************************//
SP *enter(SP* head)
{
SP *p=NULL;
fflush(stdin);
p=(SP*)malloc(sizeof(SP));
puts("Введите название продукта");
gets(p->info.name);
puts("Введите дату выхода продукта");
scanf("%d",&(p->info.year));
puts("Введите рейтинг продукта");
scanf("%d",&(p->info.rating));
p->next=head;
head=p;
return head;
}
//****************************************************************************//
void Output(SP *h1,char *s)
{
puts(s);
puts(" Название Дата выхода Рейтинг");
while(h1!=NULL)
{
printf("");
puts(h1->info.name);
printf(" %d %d",h1->info.year,h1->info.rating);
printf("/n");
fflush(stdin);
h1=h1->next;
}
}
//***********************************************************************//
SP* confirming(SP *h1)
{
int d;
SP* p=NULL,*h2=NULL, *p1=NULL,*p2=NULL;
puts("Введите рейтинг продукта");
scanf("%d",&d);
h2=h1;
while(h2!=NULL)
{
if((h2->info.rating)>d)
{
p=(SP*)malloc(sizeof(SP));
if(h2==h1)
{
p->info=h2->info;
p1=p;
p2=p;
}
else
{
p->info=h2->info;
if(p1==NULL)
{
p1=p;
p2=p;
}
else
{
p1->next=p;
p1=p;
}
}
}
if(h2->next==NULL)
p1->next=NULL;
h2=h2->next;
}
puts("Обработка завершена");
return p2;
}
SP *Sort(SP*h1)
{
int pm2=0,pm3=0,pm4=0;
int z=0;
puts("Выберите тип сортировки");
puts("1-сортировка по году");
puts("2-сортировка по рейтингу");
puts("3-Выход в главное в меню");
scanf("%d",&pm2);
do
{
switch(pm2)
{
case 1:
puts("Выберите тип сортировки");
puts("1-сортировка по убыванию");
puts("2-сортировка по возрастанию");
puts("3-Выход в над-меню");
scanf("%d",&pm3);
switch(pm3)
{
case 1:
h1=NewSort(h1,1,1);
z=1;
break;
case 2:
h1=NewSort(h1,1,2);
z=1;
break;
case 3:
break;
default:
puts("Вы ошиблись с выбором пункта меню,введите еще раз!");
getch();
break;
}
break;
case 2:
puts("Выберите тип сортировки");
puts("1-сортировка по убыванию");
puts("2-сортировка по возрастанию");
puts("3-Выход в под-меню");
getch();
scanf("%d",&pm4);
switch(pm4)
{
case 1:
h1=NewSort(h1,2,1);
z=1;
break;
case 2:
h1=NewSort(h1,2,2);
z=1;
break;
case 3:
break;
default:
puts("Вы ошиблись с выбором пункта меню,введите еще раз!");
getch();
break;
}
case 3:
break;
default:
puts("Вы ошиблись с выбором пункта меню,введите еще раз!");
getch();
break;
}
}
while (z==0);
return h1;
}
//********************************************************************************//
SP* NewSort(SP*h1,int place,int s)
{
SP *p=NULL,*p1=NULL,*p2=NULL,*p3=NULL,*p4=NULL,*p5=NULL;
int z=0;
p=h1;
p1=p->next;
if (p->next!=NULL)
{
if(p->next->next!=NULL)
{
while(p!=NULL);
{
if (p==h1)
{
p3=p;
p1=p->next;
p2=p1;
}
while(p1!=NULL)
{
if ((((p1->info.year>p->info.year && s==1)||(p1->info.year<p->info.year && s==2))&&place==1)||(((p1->info.rating>p1->info.rating&&s==1)||((p1->info.rating<p->info.rating&&s==2)))&&place==2))
{
p5=p2;
p4=p->next;
p3->next=p1;
p->next=p1->next;
if(p2!=p1)
{
p2->next=p;
p2=p1;
}
else
p2->next=p;
if(p1!=p4)
p1->next=p4;
else
p1->next=p;
p=p3->next;
if(p!=p3->next);
else
{
p=p2;
p3=p;
}
p2=p5->next;
}
else
{
p2=p1;
p1=p1->next;
}
}
if(z==0)
h1=p;
p3=p;
p=p->next;
if(p!=NULL)
if(p->next!=NULL)
p1=p->next;
else
p1=p->next;
else
p1=p;
z=1;
p2=p1;
}
}
else
{
if(p1->info.year>p->info.year)
{
p1->next=p;
p->next=NULL;
p=p1;
h1=p;
}
}
}
else
puts("В списке только один элемент");
puts("Сортировка завершена");
getch();
return h1;
}
//****************************************************************************************///
SP *Add(SP *h1)
{
SP *p1=NULL,*p=NULL;
int pm2=0;
int d=0,k=0;
p=h1;
p1=enter(p1);
puts("Куда необходимо добавить элемент?");
puts("1 - В начало");
puts("2 - В конец");
puts("3 - После заданного");
scanf("%d",&pm2);
switch(pm2)
{
case 1:
p1->next=h1;
h1=p1;
break;
case 2:
while((p->next)!=NULL)
p=p->next;
p->next=p1;
p1->next=NULL;
break;
case 3:
puts("Задайте элемент,после которого нужно добавить информацию");
scanf("%d",&d);
for(k=1;p->next!=NULL;k++)
p=p->next;
if(d<=k)
{
if(d<k)
{
p1->next=p->next;
p->next=p1;
}
else
{
p->next=p1;
p1->next=NULL;
}
}
else
printf("После %d добавление невозможно, т.к. в списке меньше элементов./n",d);
break;
default:
puts("Ошибка ввода пункта меню");
getch();
break;
}
puts("Операция добавление успешно завершена");
getch();
return h1;
}
//**************************************************************************************//
SP *Del(SP *h1)
{
SP *p=NULL,*p1=NULL;
int d=0,k;
p=h1;
puts("Введите номер элемента ,который нужно удалить. \n");
scanf("%d",&d);
for (k=1;k<(d-1);k++);
p=p->next;
if (d<=k)
{
if(d<(k-1))
{
p1=p->next;
p->next=p->next->next;
}
else
{
if(d!=1)
{
p1=p->next;
p->next=p->next->next;
}
else
{
h1=p->next;
p1=p;
if(h1==NULL)
puts("Список пуст");
}
}
free(p1);
}
else
printf("Удалить %d элемент нельзя - в списке %d элементов.\n",d,k);
free(p);
puts("Операция удаление успешно завершена");
return h1;
}
//*************************************************************************************//
void Output_2(SP *h1)
{
SP *p=NULL,*p1=NULL,*h2=NULL,*p2=NULL;
int d,s,k,z;
h2=h1;
for (k=1;h1->next!=NULL;k++)
h1=h1->next;
for(s=0;s<k;s++)
{
p=(SP*)malloc(sizeof(SP));
if(s==0)
{
p->info=h2->info;
p1=p;
p2=p;
}
else
{
p->info=h2->info;
p1->next=p;
p1=p;
}
if(s==(k-1))
p->next=NULL;
h2=h2->next;
}
p1=NULL;
puts("Вывести слева и справа от какого элемента?\n");
scanf("%d",&d);
if (d<=k)
{
for(z=1;z<(d-1);z++)
p2=p2->next;
if(d<k)
{
if(d==1)
{
p1=p2->next;
p1->next=NULL;
Output(p1,"Элемента слева нет");
}
else
{
p1=p2;
p1->next=p2->next->next;
Output(p1,"");
}
}
else
{
if(d==1) // если элемент единстенный и d=1
puts("Отсутствуют элементы справа и слева");
else
{
p1=p2;
p->next=NULL;
Output(p,"Элементов слева нет");
}
}
}
else
printf("В списке %d элементов \n",k);
getch();
while(p!=NULL)
p=Free(p);
}
SP *Free(SP *h1)
{
SP* temp=h1;
while(temp!=NULL)
{
temp=h1->next;
free(h1);
h1=temp;
}
return NULL;
}