Операция выбора элемента через указатель(->) используется для доступа к элементам динамических составных объектов. Составные объекты – это переменные производных типов, сконструированных из других типов, таких как классы или структуры. Термин динамический обозначает, что они размещены в куче с помощью операции new; элемент – это некая переменная, входящая в состав такой комплексной переменной.
Пусть мы имеем следующую структуру:
struct INTS
{int x1, x2;};
X1 и X2 – это элементы.
Если переменная этого типа определена как переменная- указатель
struct INTS *ints=new INTS;
то обращениеё к любому её элементу должно происходить с добавлением к имени переменной операции выбора элемента через указатель (->) т. е.
ints->x1=1;
ints->x2=2;
Динамические данные и структуры используются для создания эффективных структур данных – связанных списков. Связанный список – это последовательность элементов (узлов), связанных указателями. Одним из примеров является линейный связанный список. Каждый узел такого списка содержит два поля: поле данных и указатель на следующий элемент списка.
struct inlist
{ int number;
intlist *next;
}
number
next
number
number
next
· · ·…
Пример создания связанного списка, поиска значения, вставки нового элемента в список. (файл spoi_f2.cpp)
/*программа создаёт связанный список из целых
чисел, ищет заданное значение и вставляет
новый элемент в список*/
#include<iostream.h>
struct intlist
{int number;
intlist *next;
};
int getnumber()//функция ввода элементов списка
{int number;
cout<<"введите число\n";
cin>>number;
return(number);
}
intlist *create() //функция создания связанного списка
{
intlist *first;
int number;
intlist *listPtr;
intlist *lastPtr=0; //указатель на последний созданный элемент
first=0;
int i=0;
while (i<5)
{
i++;
number=getnumber();
listPtr=new intlist;
listPtr->number=number;
listPtr->next=0;
if (lastPtr) // если не первый элемент списка (lastPtr>0)
lastPtr->next=listPtr;
else
first=listPtr; // если первый элемент списка
lastPtr=listPtr;
}// закрыть while
return(first); // возвращает указатель на начало списка
}// конец функции
void printt(intlist *first) //функция печати списка
{
intlist *listPtr;
cout<<"список"<<endl;
listPtr=first;
do
{cout<<listPtr->number<<" ";
listPtr=listPtr->next;
}
while(listPtr);
return;
}
intlist *poisk(intlist *first) //функция поиска
{
intlist *listPtr1,*listPtr2,*listPtr;
int d;
cout<<"введите число для поиска";
cin>>d;
listPtr=first;
do
{if (listPtr->number==d)
listPtr1=listPtr;
//cout<<listPtr1->number<<" ";
listPtr=listPtr->next;
}
while(listPtr); // пока не конец списка
return(listPtr1); // возвращает указатель на число, которое искали
}//конец функции поиска
intlist *insert(intlist *listPtr1)//функция вставки числа
{
intlist *listPtr2;
int r;
cout<<"какое число вставить" ;
cin>>r;
listPtr2=new intlist;
listPtr2->number=r;
listPtr2->next=listPtr1->next; // то, на что ссылается прежний элемент
listPtr1->next=listPtr2;
return(listPtr1);
}
void main()
{
intlist *f,*y;//последний созданный элемент
y=create();// возвращает указатель на первый элемент списка
printt(y);
f=poisk(y); // возвращает указатель на найденный элемент