Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metodichka_SI.doc
Скачиваний:
30
Добавлен:
23.02.2015
Размер:
2.05 Mб
Скачать

1 Задача Реализовать очередь, состоящую из целых чисел

<Queue.h>

// описание типа структуры элемента очереди

typedef struct mynode

{

int info;

struct mynode* next;

}node,*list;

// описания типа структуры очередь

typedef struct myquene

{

// задание количества элементов в очереди

int num;

// объявление указателя на начало очереди

node* beg;

// объявление указателя на конец очереди

node* end;

}quene;

// инициализация очереди

void initial(quene* q);

// функция проверки очереди на «пустоту»

bool queneempty(quene* q);

// функция добавления одного элеменнта в очередь

bool additem(int x,quene* q);

// функция печать элементов очереди

void print(quene* q);

<Queue.cpp>

#include <string.h>

#include "malloc.h"

#include <stdio.h>

#include “Queue.h”

int main()

{

quene plist;

int n;

char ch;

initial(&plist);

printf("Do you want to add number?\n");

ch=getchar();

while (ch=='y')

{

scanf("%d",&n);

additem(n,&plist);

printf("Do you want to add number?\n");

getchar();

ch=getchar();

}

if (queneempty(&plist)) printf("There is not struct!\n");

else

print(&plist);

return 0;

}

<Queue_fun.cpp>

#include <string.h>

#include "malloc.h"

#include <stdio.h>

#include “Queue.h”

// инициализация очереди

void initial(quene* q)

{

q->beg=q->end=NULL;

q->num=0;

}

// функция проверки очереди на «пустоту»

bool queneempty(quene* q)

{

if (q->num==0) return true;

else return false;

}

// функция добавления одного элеменнта в очередь

bool additem(int x,quene* q)

{

node* p;

bool f;

p=(node*)malloc(sizeof(node));

if (p==NULL) f=false;

else

{

p->info=x;

p->next=NULL;

f=true;

}

if (queneempty(q))

{

q->beg=p;

q->end=p;

q->num=1;

}

else

{

q->end->next=p;

q->num++;

q->end=p;

}

return(f);

}

// функция печати элементов очереди

void print (quene* q)

{

node* p;

if (queneempty(q)) puts("pusto");

else

{

p=q->beg;

for (int i=0;i<q->num;i++)

{

printf("%d ",p->info);

p=p->next;

}

printf("\n");

}

}

Комментарий:

Очередь– это линейный список информации, работа с которой происходит по принципу “первый пришел – первый ушел”. Это значит, что первый помещенный в очередь элемент будет получен из нее первым, второй помещенный элемент будет изменен вторым и т.д.

2 Задача

Построить отсортированный двусвязный список, состоящий из целых чисел и распечатать его значения. Написать функции удаления и вставки элемента, стоящего на заданной позиции. Выбор действий пользователя реализовать с помощью меню.

<LinkedList.h>

#include <stdio.h>

// создание списка

void linked_list();

// проверка пустоты списока

bool empty();

// задание размера списка

int size();

// функция добавления нового элемента <element> в список на позицию <pos>

void add(int element, int pos);

// функция удаления элемента из списка с позиции <pos>

void remove(int pos);

// функция получение элемента списка на позиции <pos>

int get(int pos);

// функция очистки списка

void clear();

<LinkedList.cpp>

#include "LinkedList.h"

// структура, хранящая в себе число (данные) и указатель на следующий элемент коллекции

struct Node

{

int data;

struct Node* prev;

struct Node* next;

};

// главный элемент списка

Node* head;

// задание размера списка

int listSize;

void linked_list()

{

// создание головного узла списка

head = (Node*) malloc (sizeof(Node));

head->data = INT_MIN;

head->next = NULL;

head->prev = NULL;

// задание начального размера списка

listSize = 0;

}

// проверка, является ли список пустой

bool empty()

{

return head->next == NULL;

}

// размер списка

int size()

{

return listSize;

}

// добавление нового элемента <element> в список на позицию <pos>

void add(int element, int pos)

{

// если запрашиваемая позиция больше размера списка - выход

if (pos > listSize)

{

return;

}

// если список пустой - добавляем первый элемент

else if (empty())

{

Node *newNode = (Node*) malloc (sizeof(Node));

newNode->data = element;

newNode->prev = head;

newNode->next = NULL;

head->next = newNode;

}

// если добавляем на первую позицию (замещаем первый элемент)

else if (pos == 0)

{

Node *newNode = (Node*) malloc (sizeof(Node));

newNode->data = element;

newNode->prev = head;

newNode->next = head->next;

head->next = newNode;

}

else

{

// создаем новый узел для обхода

Node* tmp = (Node*) malloc (sizeof(Node));

tmp->data = head->data;

tmp->next = head->next;

// ищем нужную позицию

for(int i = -1; i < pos - 1; i++, tmp = tmp->next);

// создаем новый узел и вставляемго его в список

Node *newNode = (Node*) malloc (sizeof(Node));

newNode->data = element;

newNode->next = tmp->next;

tmp->next = newNode;

}

// увеличиваем коллекцию на 1

listSize++;

}

// удаление элемента из списка с позиции <pos>

void remove(int pos)

{

// если запрашиваемая позиция больше размера списка - выход

if (pos > listSize)

{

return;

}

// если удаляем последний элемент списка (по количеству)

else if (listSize == 1)

{

int ret = head->next->data;

head->next = NULL;

}

// если список не пуст

else if (!empty())

{

// создаем узел для обхода

Node* tmp = (Node*) malloc (sizeof(Node));

tmp->data = head->data;

tmp->next = head->next;

// ищем нужную позицию

for(int i = -1; i < pos - 1; i++, tmp = tmp->next);

// заменяем указатели

int ret = tmp->next->data;

tmp->prev = tmp;

tmp->next = tmp->next->next;

}

// уменьшаем размер списка

listSize--;

}

// получение элемента списка на позиции <pos>

int get(int pos)

{

// если запрашиваемая позиция больше размера списка - минимальное целое

if (pos > listSize)

{

return INT_MIN;

}

// если список не пуст

else if (!empty())

{

// создание узла для обхода

Node* tmp = (Node*) malloc (sizeof(Node));

tmp->data = head->next->data;

tmp->prev = head;

tmp->next = head->next->next;

// поиск нужной позиции и возвращение значения

for(int i = 0; i < pos; i++, tmp = tmp->next);

return tmp->data;

}

// возвращаем минимальное целое в любом случае, кроме описанных

return INT_MIN;

}

<main.cpp>

#include "LinkedList.h";

// вывод меню управления на экран

void printMenu()

{

printf("\n\n-------- Menu --------\n");

printf("1. Add element to List\n");

printf("2. Remove element from List\n");

printf("3. Get List element\n");

printf("4. Print List\n");

printf("5. List size\n");

printf("6. Exit\n");

printf("\n");

printf("Your choise: ");

}

// вывод списка на экран

void print()

{

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

{

printf("[%d] = %d\n", i, get(i));

}

}

int main(int argc, char* argv[])

{

// инициализация переменных

int choice = 0, data = 0, pos = 0;

linked_list();

while(true)

{

printMenu();

scanf("%d", &choice);

switch(choice)

{

case 1 :

printf("\nInput new element: ");

printf("\n\tPosition: ");

scanf("%d", &pos);

printf("\tData: ");

scanf("%d", &data);

add(data, pos);

break;

case 2 :

printf("\n\tDelete from position: ");

scanf("%d", &pos);

remove(pos);

break;

case 3 :

printf("\nInput number of element: ");

scanf("%d", &pos);

data = get(pos);

if (data == INT_MIN)

{

printf("\nList is empty");

}

else

{

printf("\n%d element in List is: %d", pos, data);

}

break;

case 4 :

printf("\nList contents is: \n");

print();

break;

case 5 :

printf("\nList size is: %d", size());

break;

case 6:

return 0;

}

}

return 0;

}

Самостоятельная работа

Даны две очереди. Реализовать функции создания новых очередей: пересечения и объединения данных очередей.

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

Разряженные матрицы

Цель: применение на практике знаний работы с разряженными матрицами.

Методические рекомендации: лабораторная работа рассчитана на 2 часа и состоит из анализа одного разобранного задания.

Самостоятельная работа не предусмотрена.

Обязательное зачетное задание.

Необходимый уровень знаний:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]