Информатика и технология программирования

Динамические массивы указателей переменной размерности


Можно попытаться сделать динамический массив указателей " еще более динамическим " . Размерность массива указателей действительно определяется во время работы, но только однократно. Все равно по мере заполнения он может переполниться. В этом случае можно предусмотреть его " расширение " путем создания динамического массива указателей большей размерности и переписывания в него указателей из исходного массива. Такой массив указателей можно назвать ВИРТУАЛЬНЫМ МАССИВОМ. Подобная структура данных также называется коллекцией. Функции, включающие дополнительные указатели, должны проверять текущую размерность динамического массива указателей. При достижении значения, кратного N, к текущей размерности массива добавляется N элементов. Подобное решение, но для обычного динамического массива было приведено в 4.7.


//------------------------------------------------------bk52-03.cpp


// Текущее количество указателей


int size(double **p)
{ for (int i=0; p[i]!=NULL; i++);
return i;
}
// Увеличение размерности виртуального массива


// при его возможном переполнении


&#35define N 20
double **extend(double **p)
{
if (p==NULL) // Создать динамический МУ при отсутствии


{p=new double*[N]; p[0]=NULL; return p;}
int k=size(p);
if ((k+1)%N==0) // количество указателей будет кратно N


{ // создать новый ДМУ


double **q=new double*[k+1+N];
for (int i=0; i&#60=k; i++)
q[i]=p[i]; // переписать указатели


delete p; // уничтожить старый ДМУ


return q; // вернуть новый ДМУ


}
return p;}
// Добавить указатель в конец ДМУ


double ** append(double **p, double *s)
{
double **q=extend(q); // при необходимости перераспределить


int k=size(q); // память


q[k]=s; q[k+1]=NULL; return q;
}
// Добавить указатель по номеру


double ** append(double **p, double *s , int n)
{
double **q=extend(q); // при необходимости перераспределить


int k=size(q); // память


if (n&#62=k) { q[k]=s; q[k+1]=NULL; } // включить последним


else
{
for (int j=k; j&#62=n; j--) q[j+1]=q[j];
q[n]=s;
}
return q;}
// Пример вызова


void main()
{ double a1,a2,a3,**vm =NULL;
vm=append( vm,&#38a1) ;
vm= append( vm,&#38a2) ;
vm= insert( vm,&#38a3,0) ;
}



Содержание раздела