Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №1 (стек)

.doc
Скачиваний:
50
Добавлен:
20.06.2014
Размер:
536.58 Кб
Скачать

2

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ

Лабораторная работа №1

по дисциплине

«Структуры и алгоритмы»

на тему:

«Программирование линейных структур данных»

Студент

Ключанских А.С

подпись, дата

фамилия, инициалы

Группа

АС-10

Принял

Журавлева М.Г.

ученая степень, звание

подпись, дата

фамилия, инициалы

Липецк 2011

  1. Задание

Разработать программу, реализующую одну из основных линейных структур данных: стек, очередь, дек, список, с использованием нескольких представлений структуры данных в памяти: а) с помощью статического массива, б) с помощью динамического массива, в) с помощью указателей.

Варианты задания представлены в таблице 1. Номер варианта выбирается в соответствии с номером по журналу.

Предусмотреть хранение индекса (номера) каждого элемента структуры данных. Программа должна предоставлять пользователю интерфейс, позволяющий выполнять:

а) выбор одного из трех указанных способов представления структуры данных в памяти;

б) выход из программы;

в) создание структуры данных «с нуля» - вначале структура данных не содержит ни одного элемента;

г) следующие операции над структурой данных:

  1. Добавление элемента (если возможно: в начало, конец, произвольную заданную позицию).

  2. Удаление элемента (если возможно: из начала, из конца, из произвольной заданной позиции).

  3. Поиск элемента.

  4. Замена «старого» значения элемента на заданное новое (поиск по значению).

  5. Установка значения элемента по заданному индексу (поиск по индексу).

  6. Получение значения элемента по заданному индексу.

  7. Удаление всех элементов.

  8. Генерация структуры данных с заданным числом элементов.

  9. Вывод на экран элементов структуры (для стеков, деков, очередей нужно использовать дополнительные временные «хранилища», а не реализовывать не присущие данным структурам функции).

К сгенерированной структуре данных должны быть применимы все остальные функции.

Вариант 1:

Структура данных: стек int + double

  1. Блок-схема программы

  1. Листинг программы

//Стек

#include <stdio.h>

#include <stdlib.h>

#include <locale.h>

#include <conio.h>

#define LEN 5

struct key{

int i;

double d;

}Y[LEN];

struct st{

int B;

int N;

int V;

struct key *X;

}stack,stack2;

char s[]="\n1. Добавить элемент \n2. Удалить элемент\n3. Показать элемент \n4. Поиск и замена\n5. Вывод всех элементов\n6. Сгенерировать структуру данных\n7. Удалить все \n8. Выход";

struct list

{

struct key value;

struct list * next;

}*head;

enum method{ptr,arr,darr}m;

int i,N;

char ch;

void start(),menu1(),menu2();

void push(struct st &stack,struct key a),push(struct list **head,struct key a),search(struct st &stack),search(struct list **head);

struct key pop(struct st &stack),pop(struct list **head);

void show(struct st stack),show(struct list *head), print(struct key),show_all(struct st &stack),show_all(struct list **head),gen(struct st &stack),gen(struct list **head),remove_all(struct st &stack),remove_all(struct list **head);

struct key fill()

{

struct key z;

printf("\nВведите int: ");

scanf("%d",&z.i);

printf("\nВведите double: ");

scanf("%lf",&z.d);

return z;

}

void main()

{

setlocale(LC_ALL,"Russian");

start();

printf("\nДля продолжения нажмите любую клавишу");

getch();

}

void start()

{

printf("\n Выберите способ представления стека:\n1).Указатели\n2).Массив\n3).Динамический массив\n4). Выход");

ch=-1;

stack.N=0;

while(!(ch>='1'&&ch<='4'))ch=getch();

m=(method)ch;

switch(m)

{

case '2':

{

stack.B=-1;

m=arr;

printf("\n 2 Массив");

stack.X=&Y[0];

stack.V=LEN;

menu1();

break;

}

case '3':

{

m=darr;

printf("\n 3 Динамический массив");

stack.X=(struct key*)malloc(sizeof(struct key));

stack.B=-1;

stack.V=1;

menu1();

break;

}

case '1':

{

m=ptr;

printf("\n 1 Указатели");

menu2();

break;

}

};

}

void print(struct key z)

{

printf("\nint=%d, double=%lf",z.i, z.d);

}

void menu1()

{

// Работа с массивом

while(ch!='8')

{

puts(s);

ch=getch();

while(!(ch>='1'&&ch<='8'))ch=getch();

switch(ch)

{

case '1': push(stack,fill());break;

case '2': pop(stack);break;

case '3': show(stack);break;

case '4': search(stack);break;

case '5': show_all(stack);break;

case '6': gen(stack);break;

case '7': remove_all(stack);break;

}

}

printf("\nВыход");

printf("\nВывод массива");

if(m==darr)free(stack.X);

start();

}

void push(struct st &stack,struct key a)

{

if(stack.N==stack.V)

{

if(m==arr)

{

printf("Стек переполнен, удалите элементы");

return;

}

else

{

if(m==arr)return;

stack.V+=10;

stack.X=(struct key *)realloc(stack.X,stack.V*sizeof(struct key));

}

}

stack.B++;

stack.X[stack.B]=a;

stack.N++;

}

struct key pop(struct st &stack)

{

if(stack.N){stack.N--;stack.B--;}

else return stack.X[stack.B];

return stack.X[stack.B+1];

}

void show(struct st stack)

{

if(stack.N)print(stack.X[stack.B]);

else printf("\nЭлементов нет");

}

void search(struct st &stack)

{

int i;

bool flag=1;

printf("\nВведите искомый элемент:");

struct key a=fill(),b;

struct st stack2;

stack2.B=-1;

stack2.N=0;

stack2.X=(struct key *)malloc(sizeof(struct key));

int n=stack.N;

for(i=0;i<n;i++)

{

b=pop(stack);

if(a.i==b.i&&a.d==b.d)

{

printf("\nЭлемент найден");

printf("\nВведите новое значение");

b=fill();

}

push(stack2,b);

}

for(i=0;i<n;i++)push(stack,pop(stack2));

if(flag)printf("\n Элемент не найден");

}

void show_all(struct st &stack)

{

struct st stack2;

stack2.B=-1;

stack2.N=0;

stack2.X=(struct key *)malloc(sizeof(struct key));

struct key b;

int N=stack.N;

for(i=0;i<N;i++)

{

b=pop(stack);

print(b);

push(stack2,b);

}

for(i=0;i<N;i++)push(stack,pop(stack2));

}

void gen(struct st &stack)

{

printf("\nВведите количество элементов: ");

int n;

scanf("%d",&n);

remove_all(stack);

struct key a;

for(int i=0;i<n;i++)

{

a.i=rand();

a.d=(float)rand()*rand()/rand();

push(stack,a);

}

printf("\nНовые элементы");

show_all(stack);

}

void remove_all(struct st &stack)

{

while(stack.N)pop(stack);

}

void menu2()

{

head=0;

// Работа с односвязным списком

N=0;

while(ch!='8')

{

puts(s);

ch=getch();

while(!(ch>='1'&&ch<='8'))ch=getch();

switch(ch)

{

case '1': push(&head,fill());break;

case '2': pop(&head);break;

case '3': show(head);break;

case '4': search(&head);break;

case '5': show_all(&head);break;

case '6': gen(&head);break;

case '7': remove_all(&head);break;

}

}

}

void push(struct list **head,struct key a)

{

struct list *ptr=*head;

*head=(struct list*)malloc(sizeof(struct list));

(*head)->next=ptr;

(*head)->value=a;

N++;

}

struct key pop(struct list **head)

{

struct key z;

z.d=z.i=0;

if(!*head)

{

printf("Элементов нет");

return z;

}

struct list *ptr=*head;

*head=(*head)->next;

z=ptr->value;

free(ptr);

N--;

return z;

}

void show(struct list *head)

{

if(head)print(head->value);

else printf("\nЭлементов нет");

}

void search(struct list **head)

{

int i;

bool flag=1;

printf("\nВведите искомый элемент:");

struct key a=fill(),b;

struct list *head2;

int n=N;

for(i=0;i<n;i++)

{

b=pop(head);

if(a.i==b.i&&a.d==b.d)

{

printf("\nЭлемент найден");

printf("\nВведите новое значение");

b=fill();

flag=0;

}

push(&head2,b);

}

for(i=0;i<n;i++)push(head,pop(&head2));

if(flag)printf("\n Элемент не найден");

}

void show_all(struct list **head)

{

struct list *head2;

struct key b;

for(i=0;i<N;i++)

{

b=pop(head);

print(b);

push(&head2,b);

}

for(i=0;i<N;i++)push(head,pop(&head2));

}

void gen(struct list **head)

{

printf("\nВведите количество элементов: ");

int n;

scanf("%d",&n);

remove_all(head);

struct key a;

for(int i=0;i<n;i++)

{

a.i=rand();

a.d=(float)rand()*rand()/rand();

push(head,a);

}

printf("\nНовые элементы");

show_all(head);

}

void remove_all(struct list **head)

{

while(N)pop(head);

printf("\nВсе элементы удалены");

}

  1. Контрольный пример

  1. Выводы о проделанной работе

При выполнении данной лабораторной работы я разработал программу, реализующую одну из основных линейных структур данных: стек.

  1. Список использованной литературы

  1. Шилдт Г. Искусство программирования на C++. БХВ.2005

  2. Шилдт Г. C++ Руководство для начинающих. Вильямс.2005