Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1,2,3,6 ,курсач (Жека) / Лаба 3 прога.docx
Скачиваний:
19
Добавлен:
09.02.2015
Размер:
64.09 Кб
Скачать

Описание функции «Add»

Назначение: функция добавляет элемент в существующий список.

Прототип: SP*Add(SP*), где тип возвращаемого значенияSP*- указатель на голову списка, первый тип параметраSP* - указатель на голову списка.

Пример вызова: h1=Addh1), гдеh1 указатель на голову списка.

Описание переменных: описание локальных переменных функцииdobavприведено в таблице 9.

Таблица 9. Описание локальных переменных функции dobav.

Имя переменной

Тип переменной

Назначение

d, k

int

Вспомогательные переменные

pm2

int

Переменная для управления меню

p1,p

SP *

Вспомогательные переменные

Описание функции «Del»

Назначение: функция удаляет элемент из списка.

Прототип: SP*Del(SP*), где тип возвращаемого значенияSP*- указатель на голову списка, первый тип параметраSP*- указатель на голову списка.

Пример вызова: h1=Del(h1), гдеh1 - указатель на голову списка.

Описание переменных: описание локальных переменных функцииDelприведено в таблице 10.

Таблица 10. Описание переменных функции Del

Имя переменной

Тип переменной

Назначение

d,k

int

Вспомогательные переменные

p1, p

SP *

Вспомогательные переменные

Описание функции «Output_2»

Назначение: функция выводит информационные поля элементов, расположенных справа и слева от заданного.

Прототип: voidOutput_2(SP*), где первый тип параметраSP* - указатель на голову списка.

Пример вызова: Output_2 (h1), гдеh1 - указатель на голову списка.

Описание переменных: описание локальных переменных функцииOutput_2 приведено в таблице 11.

Таблица 11. Описание локальных переменных функции Output_2

Имя переменной

Тип переменной

Назначение

k,z

int

Вспомогательные переменные

p, p1, h2, p2

SP *

Вспомогательные переменные

Код программы на языке 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* pred;

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*);

char End(void);

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;

if(head!=NULL)

head->pred=p;

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*h2=NULL, *p=NULL;

puts("Введите рейтинг продукта");

scanf("%d",&d);

h2=h1;

scanf("%d", &d);

h2=h1;

while(h2!=NULL)

{

if((h2->info.rating)<d)

{

p=h2->next;

if(h2->next!=NULL || h2->pred!=NULL)

{

if(h2->next!=NULL)

{

if(h2->pred!=NULL)

{

h2->next->pred=h2->pred;

h2->pred->next=h2->next;

}

else

{

h2->next->pred=NULL;

h1=h2->next;

}

}

else

h2->pred->next=NULL;

free(h2);

h2=p;

}

else

{

free(h1);

h2=h1=NULL;

}

}

else

h2=h2->next;

}

puts("Обработка завершена\n");

return h1;

}

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;

int z=0;

p=h1;

if(p->next!=NULL)

{

while(p!=NULL)

{

p1=p->next;

p2=p1;

if(p1!=NULL)

p3=p1->next;

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>p->info.rating && s==1) || ((p1->info.rating<p->info.rating && s==2)))&&place==2) || ((((strcmp(p1->info.name, p->info.name)>0) && s==1) || ((strcmp(p1->info.name, p->info.name)<0)&&s==2)) && place==3))

{

if(p->next!=p)

{

p1->pred->next=p;

p->next->pred=p1;

p1->next=p->next;

}

else

p1->next=p;

if(p->pred!=NULL)

p->pred->next=p;

p1->pred=p->pred;

p->pred=p2;

p->next=p2;

if(p3!=NULL)

p3->pred=p;

p=p1;

}

p=p3;

if(p1!=NULL)

{

p2=p1->pred;

p3=p1->next;

}

}

if(p->pred==NULL)

h1=p;

p=p->next;

}

}

else

puts("В списке всего один элемент\n");

puts("Операция сортировки завершена\n");

getch();

return h1;

}

//****************************************************************************************///

SP *Add(SP *h1)

{

SP *p1=NULL,*p=NULL;

int pm2=0;

int d=0,k=1;

p=h1;

p1=enter(p1);

puts("Куда необходимо добавить элемент?");

puts("1 - В начало");

puts("2 - В конец");

puts("3 - После заданного");

scanf("%d",&pm2);

switch(pm2)

{

case 1:

p1->next=h1;

h1->pred=p1;

h1=p1;

h1->pred=NULL;

break;

case 2:

while((p->next)!=NULL)

p=p->next;

p->next=p1;

p1->next=NULL;

p1->pred=p;

break;

case 3:

puts("Задайте элемент,после которого нужно добавить информацию");

scanf("%d",&d);

while(p!=NULL && k!=d)

{

p=p->next;

k++;

}

if(k==d)

{

if(p->next!=NULL)

{

p1->next=p->next;

p->next->pred=p1;

p->next=p1;

}

else

{

p->next=p1;

p1->pred=p;

p1->next=NULL;

}

}

else

printf("Элемента номер %d не существует!", d);

break;

default:

puts("Ошибка ввода пункта меню");

getch();

break;

}

puts("Операция добавление успешно завершена");

getch();

return h1;

}

//**************************************************************************************//

SP *Del(SP *h1)

{

SP *p=NULL,*p1=NULL;

int d=0,k=0;

p=h1;

puts("Введите номер элемента ,который нужно удалить. \n");

scanf("%d",&d);

while(p->next!=NULL && k!=d)

{

p=p->next;

k++;

}

if(k==d)

{

if(d!=1) // если заданный элемент не первый

{

if(p->next!=NULL)

{

p->pred->next=p->next;

p->next->pred=p->pred;

}

else

p->pred->next=NULL;

}

else // заданный элемент первый

{

if(p->next!=NULL)

{

h1=p->next;

h1->pred=NULL;

}

else

h1=NULL;

}

}

else

printf("Элемента %d не существует!", d);

free(p);

puts("Операция удаления успешно завершена\n");

return h1;

}

//*************************************************************************************//

void Output_2(SP *h1)

{

SP *p=NULL,*p1=NULL,*p2=NULL;

int k=0,z=1;

p=h1;

puts("Sleva i sprava ot kakogo elemena vivesti?\n");

scanf("%d", &k);

while(p->next!=NULL && z!=k)

{

p=p->next;

k++;

}

if(k==z) // заданный элемент существует

{

if(k==1) // выбран первый элемент

{

puts("Элемент слева отсуствует\n");

if(p->next!=NULL)

{

p1=p->next;

p2=p->next->next;

p1->next=NULL;

Output(p1, "");

p1->next=p2;

}

else

puts("Элемент справа отсуствует\n");

}

else // выбран не первый элемент

{

if(p->next!=NULL)

{

p1=p->pred;

p2=p->next->next;

p1->next=p->next;

p1->next->next=NULL;

Output(p1, "");

p1->next->next=p2;

p1->next=p;

}

else

{

puts("Элементы справа отсуствуют\n");

p1=p->pred;

p1->next=NULL;

Output(p1, "");

p1->next=p;

}

}

}

else

printf("Элемента %d не сушесвует!",k);

getch();

}

SP *Free(SP *h1)

{

SP *temp=NULL;

temp=h1;

while(temp!=NULL)

{

temp=h1->next;

free(h1);

h1=temp;

}

return NULL;

}

//************************************************************************************//Результаты выполнения программы

При выполнении программы полученные результаты совпадают с приведенными в таблице 1 "Контрольные примеры". Ошибок не обнаружено.

Выводы

При выполнении лабораторной работы получены практические навыки в работе с односвязными списками на языке С/С++.

Соседние файлы в папке 1,2,3,6 ,курсач (Жека)