Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Методический пример






Цель работы

 

Целью работы является ознакомление с методами работы с динамическими структурами.

Постановка задачи

Разработать программный продукт в соответствии с основными методами работы с динамическими элементами по конкретному варианту задания.

 

 

Методический пример

 

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

 

#include < stdio.h>

#include < stdlib.h>

#include < iostream.h>

#include < conio.h>

void main()

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

// и указателей на требуемые элементы

struct el { struct el* pred;

int ELEM;

struct el* posl;

}

EL1, *pTEK, *pPRED, *temp, *pSTART1, *pEND1, *pSTART2, *pEND2;

int i, z, flag=0;

clrscr();

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

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

for(;;)

{

cout< < " \nввести элемент? "; cin> > z;

if (z< 1) break;

pTEK=(struct el*)(malloc(sizeof(EL1))); //выделенная память //заносится в указатель

//на текущий элемент

cout< < " \nэлемент="; cin> > pTEK-> ELEM; //первоначальное

//опреде-

pTEK-> pred=0; //ление полей элемента

pTEK-> posl=0; // списка

//при создании первого элемента сохраняются соответствующие адреса

if(flag==0){pSTART1=pTEK; pPRED=pTEK;

pEND1=pTEK; flag=1; continue; }

pPRED-> posl=pTEK; // заполнение полей

pTEK-> pred=pPRED; // элементов списка

pEND1=pPRED=pTEK; // изменение указателей на конец списка // и предыдущий элемент

}

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

pTEK=pSTART1;

cout< < " \nадрес нач элем: " < < pSTART1;

do

cout< < " \n " < < pTEK-> pred< < " " < < pTEK-> ELEM< < " " < < pTEK-> posl;

pTEK=pTEK-> posl;

while(pTEK! =0);

cout< < " \nадрес кон элем: " < < pEND1;

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

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

flag=0;

for(;;){

 

cout< < " \n ввести элемент: "; cin> > z;

if (z< 1) break;

pTEK=(struct el*)(malloc(sizeof(EL1)));

cout< < " \n элемент="; cin> > pTEK-> ELEM;

pTEK-> pred=0;

pTEK-> posl=0; if(flag==0){pSTART2=pTEK; pPRED=pTEK; pEND2=pTEK; flag=1;

continue; }

pPRED-> posl=pTEK;

pTEK-> pred=pPRED;

pEND2=pPRED=pTEK;

}

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

pTEK=pSTART2;

cout< < " \nадрес нач элем: " < < pSTART2;

do

cout< < " \n " < < pTEK-> pred< < " " < < pTEK-> ELEM< < " " < < pTEK-> posl;

pTEK=pTEK-> posl;

while(pTEK! =0);

cout< < " \nадрес кон элем: " < < pEND2;

int ch, d;

cout< < " \nВвести число для проверки ";

cin> > ch;

// поиск искомого числа в первом списке и добавление его

// в конец второго списка

flag=0; //flag указание на начало работы с первым эл

pTEK=pSTART1;

for(;;){

temp=pTEK-> posl; // в temp хранится адрес послед элем списка

// что требуется для выхода из цикла

if(pTEK-> ELEM! =ch)

if (temp==0) break;

{pTEK=pTEK-> posl; flag=1;

continue; }

 

if(flag==0)pSTART1=pTEK-> posl; //если начальный элемент списка

//удаляется то изменяется

//начальный адрес списка ((pTEK-> pred)-> posl)=(pTEK-> posl); // перезапися адресов впер-

((pTEK-> posl)-> pred)=(pTEK-> pred); // вом списке

pEND2-> posl=pTEK; //добавлениеэлемента в

pTEK-> posl=0; // конец второго списка, и

pTEK-> pred=pEND2; // настройка

//соответствующих

pEND2=pTEK; // полей элем

pTEK=temp; // занесение в указатель

// адреса след элем

 

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

cout< < " \n--------------------------";

pTEK=pSTART1;

cout< < " \nадрес нач элем: " < < pSTART1;

do

cout< < " \n " < < pTEK-> pred< < " " < < pTEK-> ELEM< < " " < < pTEK-> posl;

pTEK=pTEK-> posl;

while(pTEK! =0);

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

pTEK=pSTART2;

cout< < " \nадрес нач элем: " < < pSTART2;

do

cout< < " \n " < < pTEK-> pred< < " " < < pTEK-> ELEM< < " " < < pTEK-> posl;

pTEK=pTEK-> posl;

while(pTEK! =0);

cin> > d;

/* добавление в первый список */

flag=0;

pTEK=pSTART2;

for(;;)

temp=pTEK-> posl;

if(pTEK-> ELEM! =ch)

if (temp==0) break;

pTEK=pTEK-> posl; flag=1;

continue;

 

if(flag==0)pSTART2=pTEK-> posl;

((pTEK-> pred)-> posl)=(pTEK-> posl);

((pTEK-> posl)-> pred)=(pTEK-> pred);

pSTART1-> pred=pTEK;

pTEK-> pred=0;

pTEK-> posl=pSTART1;

pSTART1=pTEK;

pTEK=temp;

 

cout< < " \n--------------------------";

pTEK=pSTART1;

cout< < " \nадрес нач элем: " < < pSTART1;

do

cout< < " \n " < < pTEK-> pred< < " " < < pTEK-> ELEM< < " " < < pTEK-> posl;

pTEK=pTEK-> posl;

while(pTEK! =0);

pTEK=pSTART2;

cout< < " \nадрес нач элем: " < < pSTART2;

do

cout< < " \n " < < pTEK-> pred< < " " < < pTEK-> ELEM< < " " < < pTEK-> posl;

pTEK=pTEK-> posl;

while(pTEK! =0);

 

Контрольные вопросы

1. Что из себя представляет динамическая память.

2. Как динамическая память выделяется и освобождается.

3. Может быть элементом списка двумерный массив чисел, если под него тоже динамически выделяется память.

4. Может быть элементом списка структура, если под нее тоже динамически выделяется память.

5. Может быть элементом списка динамический список.

6. Что из себя представляет кольцевой список.

7. Что из себя представляет двунаправленный список.


Варианты заданий

Тип списка Элемент списка Действия Создать список из соответствующих элементов
  однонаправленный Строка из 10 символов Найти строку сииволов по строке, введенной с клавиатуре, и удалить ее.
  двунаправленный вещественное Найти вещественное число по числу, введенному с клавиатуры, и удалить его.
  Однонаправленный кольцевой целое Найти целое число по числу, введенному с клавиатуры и удалить его.
  Двунаправленный кольцевой символ Найти символ число по символу, введенному с клавиатуры, и удалить его.
  однонаправленный Строка из 10 символов Найти строку сииволов по строке, введенной с клавиатуре, и после нее добавить новую строку.
  двунаправленный вещественно Найти вещественное число по числу, введенному с клавиатуры, и после него добавить новое число.
  Однонаправленный кольцевой целое Найти целое число по числу, введенному с клавиатуры и после него добавить новое число.
  Двунаправленный кольцевой символ Найти символ число по символу, введенному с клавиатуры, и после него добавить новый символ.
  однонаправленный Строка из 10 символов Найти строку сииволов по строке, введенной с клавиатуре, и заменитьее ее новой строкой.
  двунаправленный вещественное Найти вещественное число по числу, введенному с клавиатуры, и заменить его новым числом.
  Однонаправленный кольцевой целое Найти целое число по числу, введенному с клавиатуры и заменить его новым числом.
  Двунаправленный кольцевой символ Найти символ число по символу, введенному с клавиатуры, и заменить его новым символом.

 


 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.