- •Описание структуры
- •Описание списка
- •Контрольные примеры
- •Описание переменных главной функции
- •Краткое описание алгоритма
- •Описание функций Описание функции vvod
- •Описание функции vivod
- •Описание функции obrabotka
- •Описание функции sortirovka
- •Описание функции dobav
- •Описание функции ydal
- •Описание функции vivod2
- •Описание функции f_s
- •Описание функции The_end
- •Иерархическая структура программы
- •Код программы на языке c
- •Результаты выполнения программы
Описание функции ydal
Назначение: функция удаляет элемент из списка.
Прототип: SP*ydal(SP*,int), где тип возвращаемого значенияSP*- адрес первого элемента списка, первый тип параметраSP* - адрес первого элемента списка, второй тип параметраint– размер исходного списка.
Пример вызова: h1=ydal(h1, k), гдеh1 - адрес первого элемента списка,k- размер исходного списка.
Описание переменных: описание локальных переменных функцииydalприведено в таблице 9.
Таблица 9. Описание переменных функции ydal
Имя переменной |
Тип переменной |
Назначение |
d, z |
int |
Вспомогательные переменные |
q, r |
SP * |
Вспомогательные переменные |
Описание функции vivod2
Назначение: функция выводит информационные поля элементов, расположенных справа и слева от заданного.
Прототип: voidvivod2(SP*,int), где первый тип параметраSP* - адрес первого элемента списка, второй тип параметраint– размер исходного списка.
Пример вызова: vivod2(h1, k), гдеh1 - адрес первого элемента списка,k- размер исходного списка.
Описание переменных: описание локальных переменных функцииvivod2 приведено в таблице 10.
Таблица 10. Описание локальных переменных функции vivod2
Имя переменной |
Тип переменной |
Назначение |
d, z, s |
int |
Вспомогательные переменные |
r, p, h2, r2 |
SP * |
Вспомогательные переменные |
Описание функции f_s
Назначение: определяет, является ли символ знаком препинания, пробелом и т.д.
Прототип: int f_s(char ),где тип параметраchar– символ, который нужно проверить, тип возвращаемого значенияint– переменная, которой присваивается 1 , если данный символ знак препинания, пробел и т.д.
Пример вызова: f_s(*(stroka+j)), где*(stroka+j) -символ, который нужно проверить.
Описание переменных: jписание локальных переменных функцииf_sприведено в таблице 11.
Таблица 11. Описание локальных переменных функции f_s
Имя переменной |
Тип переменной |
Назначение |
I |
int |
Вспомогательная переменная |
Simvol |
char* |
Адрес первого элемента массива знаков препинания |
Описание функции The_end
Назначение: функция для завершения программы и освобождения динамической памяти.
Прототип: charThe_end(NT*,NT*), гдеchar– тип возвращаемого значения, тип первого параметраST* - адрес первого элемента последовательности структур, второй тип параметраNT* - адрес первого элемента последовательности структур – результата.
Пример вызова: c = The_end(players, rez).
Описание переменных: описание локальных переменных функцииThe_endприведено в таблице 12.
Таблица 12. Описание локальных переменных функции The_end
Имя переменной |
Тип переменной |
Назначение |
c |
char |
Переменная для управления циклом |
Иерархическая структура программы
vvod() f_s() obrabotka() ydal() dobav() vivod2
() vivod() The_end() sortirovka() main() Рис.
1.
Иерархическая структура программы
Код программы на языке c
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <tchar.h>
#include <string.h>
typedef struct football
{
char name[12]; // Имя, фамилия футболиста
int age; // Возраст футболиста
int goals; // Кол-во голов
} NT;
typedef struct list
{
NT info;
struct list *next;
}SP;
SP *vvod(SP *);
void vivod(SP *, char *, int k); // вывод данных
SP *obrabotka(SP *, int , int *);
SP *sortirovka(SP *);
SP *dobav(SP *, int);
SP *ydal(SP *, int);
void vivod2(SP *, int );
SP *fre(SP *);
char The_end(void);
int _tmain(void)
{
SP *h1=NULL, *rez=NULL;
int pm, pm2; // переменные для выбора пунктов меню
char c=NULL, ch=NULL;
int k=0, z=0; // переменные, показывающие кол-во элементов в списке
int q; // переменная для управления меню
do
{
clrscr();
puts("*************Menu**************\n");
puts("1 - Vvod dannih\n");
puts("2 - Vivod spiska\n");
puts("3 - Formirovanie novogo spiska\n");
puts("4 - Dobovlenie elementa v spisok\n");
puts("5 - Ydalenie elementa iz spiska\n");
puts("6 - Sortirovka\n");
puts("7 - Vivod sleva i sprava ot zadannogo\n");
puts("0 - Vihod\n");
puts("Choose a point of menu.\n");
fflush(stdin);
scanf("%d", &pm);
switch (pm)
{
case 1:
if(q!=1)
{
while(h1!=NULL)
h1=fre(h1);
k=0;
while(ch!='y')
{
h1=vvod(h1);
puts("\nZakonchit vvod dannyh(y/n)?\n");
ch=getch();
k++;
}
q=1;
}
else
puts("Vi yge vvodili dannii!\n");
getch();
break;
case 2:
if(q!=0)
{
if(h1!=NULL)
vivod(h1, "Polychuvshiisy spisok:", k);
else
puts("Spisok pust!\n");
getch();
}
else
puts("Vi ne vipolnili 1 pynkt menu!\n");
break;
case 3:
if(h1!=NULL)
{
while(rez!=NULL)
rez=fre(rez);
rez=obrabotka(h1, k, &z);
if(rez!=NULL)
vivod(rez, "", z);
else
puts("V spiske net elementov c zadannim usloviem.\n");
getch();
}
else
puts("Obrabotka ne vozmogna-spisok pust.\n");
getch();
break;
case 4:
if(h1!=NULL)
{
h1=dobav(h1, k);
k++;
}
else
puts("Dobavlenie elementov ne vozmogno-spisok pust.\n");
getch();
break;
case 5:
if(h1!=NULL)
{
h1=ydal(h1, k);
k=k-1;
}
else
puts("Ydalenie elementov ne vozmogno-spisok pust.\n");
getch();
break;
case 6:
if(h1!=NULL)
h1=sortirovka(h1);
else
puts("Sortirovka ne vozmogna-spisok pust.\n");
getch();
break;
case 7:
if(h1!=NULL)
vivod2(h1, k);
else
puts("Spisok pust.\n");
getch();
break;
case 0:
while(h1!=NULL)
h1=fre(h1);
while(rez!=NULL)
rez=fre(rez);
c=The_end();
break;
default:
puts("You are wrong! Try again!");
getch();
break;
}
}
while(c != 'y');
return 0;
}
//........................................................................
SP *vvod(SP *head)
{
SP *r=NULL;
fflush(stdin);
r=(SP*)malloc(sizeof(SP));
puts("Write name of football player.\n");
gets(r->info.name);
puts("\nWrite an age.\n");
scanf("%d", &(r->info.age));
puts("\nWrite total goals.\n");
scanf("%d", &(r->info.goals));
r->next=head;
head=r;
return head;
}
//....................................................................
void vivod (SP *h1, char *s, int k)
{
int q=0;
puts(s);
puts("\n Name Age Goals\n");
while(q<k)
{
printf(" ");
puts(h1->info.name);
printf(" %d %d", h1->info.age, h1->info.goals);
printf("\n");
fflush(stdin);
h1=h1->next;
q++;
}
}
//....................................................................
SP *obrabotka(SP *h1, int k, int *z)
{
int t=0, d;
SP *r=NULL, *h2=NULL, *p=NULL, *r2=NULL;
puts("VVedite kolichestvo golov.\n");
scanf("%d", &d);
h2=h1;
while(h2!=NULL)
{
if((h2->info.goals)>d)
{
r=(SP*)malloc(sizeof(SP));
if(t==0)
{
r->info=h2->info;
p=r;
r2=r;
}
else
{
r->info=h2->info;
p->next=r;
p=r;
}
t++;
}
else
return NULL;
if(t==(k-1))
p->next=NULL;
h2=h2->next;
}
*z=t;
puts("Obrabotka zavershena.\n");
return r2;
}
//.....................................................................
SP *sortirovka(SP *h1)
{
int pm2=0, pm3=0, pm4=0; // Переменные выбора меню
SP *h2=NULL, *r=NULL;
NT b;
int h=0;
puts("Vibirete tip sortirovki:\n");
puts("1 - Sortirovka po vozrastu.\n");
puts("2 - Sortirovka po kolichestvu golov.\n");
puts("3 - Vihod v nadmenu\n");
scanf("%d", &pm2);
h2=h1;
do
{
switch(pm2)
{
case 1:
puts("Vibirete tip sortirovki.\n");
puts("1 - Sortirovka po ybivaniu.\n");
puts("2 - Sortirovka po vozrastaniu.\n");
puts("3 - Vihod v nadmenu\n");
getch();
scanf("%d", &pm3);
switch(pm3)
{
case 1:
while((h2->next)!=NULL)
{
r=h2->next;
while(r!=NULL)
{
if(h2->info.age<r->info.age)
{
b=r->info;
r->info=h2->info;
h2->info=b;
}
r=r->next;
}
h2=h2->next;
}
puts("Sortirovka zavershina.\n");
getch();
h=1;
break;
case 2:
while((h2->next)!=NULL)
{
r=h2->next;
while(r!=NULL)
{
if(h2->info.age>r->info.age)
{
b=r->info;
r->info=h2->info;
h2->info=b;
}
r=r->next;
}
h2=h2->next;
}
puts("Sortirovka zavershina.\n");
getch();
h=1;
break;
case 3:
break;
default:
puts("You are wrong! Try again!");
getch();
break;
}
break;
case 2:
puts("Vibirete tip sortirovki.\n");
puts("1 - Sortirovka po ybivaniu.\n");
puts("2 - Sortirovka po vozrastaniu.\n");
getch();
scanf("%d", &pm4);
switch(pm4)
{
case 1:
while((h2->next)!=NULL)
{
r=h2->next;
while(r!=NULL)
{
if(h2->info.goals<r->info.goals)
{
b=r->info;
r->info=h2->info;
h2->info=b;
}
r=r->next;
}
h2=h2->next;
}
puts("Sortirovka zavershina.\n");
getch();
h=1;
break;
case 2:
while((h2->next)!=NULL)
{
r=h2->next;
while(r!=NULL)
{
if(h2->info.goals>r->info.goals)
{
b=r->info;
r->info=h2->info;
h2->info=b;
}
r=r->next;
}
h2=h2->next;
}
puts("Sortirovka zavershina.\n");
getch();
h=1;
break;
case 3:
break;
default:
puts("You are wrong! Try again!");
getch();
break;
}
break;
case 3:
break;
default:
puts("You are wrong! Try again!");
getch();
break;
}
}
while(h==0);
return h1;
}
//......................................................................
SP *dobav(SP *h1, int k)
{
SP *q=NULL, *r=NULL;
int pm2;
int d=0, z=0;
r=h1;
q=vvod(q);
puts("Kuda vi hotite dobavit element?\n");
puts("1 - v nachalo\n");
puts("2 - v konez\n");
puts("3 - posle zadannogo\n");
scanf("%d", &pm2);
switch(pm2)
{
case 1:
q->next=h1;
h1=q;
break;
case 2:
while((r->next)!=NULL)
r=r->next;
r->next=q;
q->next=NULL;
break;
case 3:
puts("Posle kakogo elementa dobavit?\n");
scanf("%d", &d);
if(d<=k)
{
for(z=1; z<d; z++)
r=r->next;
if(d<k)
{
q->next=r->next;
r->next=q;
}
else
{
r->next=q;
q->next=NULL;
}
}
else
printf("Posle %d nelzy dobavit - v spiske %d element(-ov)!\n", d, k);
break;
default:
puts("You are wrong! Try again!");
getch();
break;
}
puts("Dobavlenieelementa uspeshno zavershino\n");
getch();
return h1;
}
//.....................................................................
SP *ydal(SP *h1, int k)
{
SP *r=NULL, *p=NULL;
int d, z;
r=h1;
puts("Vvedite nomer elementa, kotoriy nugno ydalit.\n");
scanf("%d", &d);
if(d<=k)
{
for(z=1; z<(d-1); z++)
r=r->next;
if(d<(k-1))
{
p=r->next;
r->next=r->next->next;
}
else
{
if(d!=1)
{
p=r->next;
r->next=r->next->next;
}
else
{
h1=r->next;
p=r;
if(h1==NULL)
puts("Spisok teper pust!\n");
}
}
free(p);
}
else
printf("Ydalit %d nelzy - v spiske %d elementov!\n", d, k);
free(p);
puts("Ydalenie zavershino.\n");
return h1;
}
//.....................................................................
void vivod2(SP *h1, int k)
{
SP *r=NULL, *p=NULL, *h2=NULL, *r2=NULL;
int d, z, s;
h2=h1;
for(s=0; s<k; s++)
{
r=(SP*)malloc(sizeof(SP));
if(s==0)
{
r->info=h2->info;
p=r;
r2=r;
}
else
{
r->info=h2->info;
p->next=r;
p=r;
}
if(s==(k-1))
p->next=NULL;
h2=h2->next;
}
p=NULL;
puts("Sleva i sprava ot kakogo elemena vivesti?\n");
scanf("%d", &d);
if(d<=k)
{
for(z=1; z<(d-1); z++)
r2=r2->next;
if(d<k)
{
if(d==1) //выбран 1 элемент
{
p=r2->next;
p->next=NULL;
vivod(p, "Elementa sleva net", 1);
}
else //выбран элемент слева и справа от которого существуют элементы
{
p=r2;
p->next=r2->next->next;
vivod(p, "", 2);
}
}
else
{
if(d==1) // если элемент один и d=1
puts("Elementov sprava i sleva net.\n");
else // елемента справа нет
{
p=r2;
p->next=NULL;
vivod(p, "Elementa sprava net", 1);
}
}
}
else
printf("V spiske vsego %d elementov!\n", k);
getch();
while(r!=NULL)
r=fre(r);
}
//.....................................................................
int f_s(char c)
{
int i, n;
char *simvol=" ;:,-_)(+=\/><`~|^.?!@#$&";
n = strlen(simvol);
for( i=0; i < n; i++)
if(c==simvol[i])
return 1;
return 0;
}
//...................................................................
SP *fre(SP *h1)
{
if((h1->next)!=NULL)
free(h1);
return NULL;
}
//.......................................................................
char The_end(void)
{
char c;
c = 'y';
printf("\nGoodbye!");
return c;
}