C/C++

помогите с шаблонами,пожалуйста..

условие: Массив переменного размера на основе связного списка непрерывных фрагментов (доступ по индексу,включение,исключение элементов)
где можно про это посмотреть вообще хоть что-ть?
может кто-ть подскажет с описанием шаблона и с как-ть одной функцией..
спасибо..
не решай все задачи сразу. Для начала забудь о шаблонах, и напиши просто для того же int. Когда все напишешь - не будет проблем превратить это в шаблон.
Исходники STL помотри
Эх, добрый я сегодня, наваял специально для тебя )
Код LinkedList.h:
Код
спасибо
А разве это то,что мне надо? По сути, мне ведь нужно описать однонаправленный(?) список с динамическими массивами в качестве полей данных..причем в первой ячейке(элементе списка) содержатся элементы массива с индексами (допустим, если разбиваем по 5) 0,1,2,3,4....во второй 5,6,7,8,9 и т.д. Разве должна быть такая прога как вы описали?
А разве это то,что мне надо? По сути, мне ведь нужно описать однонаправленный(?) список с динамическими массивами в качестве полей данных..причем в первой ячейке(элементе списка) содержатся элементы массива с индексами (допустим, если разбиваем по 5) 0,1,2,3,4....во второй 5,6,7,8,9 и т.д. Разве должна быть такая прога как вы описали?
Если условие было такое:
Цитата
Нет..вы понимаете,что мне препод сам нарисовал структуру........
......................... .........................
| | | | | | -------->| | | | | | --------> .........
......................... .........................
0 1 2 3 4 5 6 7 8 9
Цифры-это индексы массива (это для случая,если мы разбиваем по 5)....
Но ведь прога,которую вы написали, совсем не то....как мне кажется....я права?
Блин,как-то совсем криво выложилось....
ладно,опишу....допустим,если мы разбиваем по 5 эл-в.....тогда первая ячейка состоит из 5 эл-в....индексы этих эл-в 0,1,2,3,4....вторая тоже из 5 (индесы эл-в-5,6,7,8,9) и т.д. Эти ячейки и являются элементами связанного списка....т.е.в связанном списке инф.полем является не один эл-т, а массив....вся сложность(для меня) в том, что индексы в каждой ячейке не о,1,2,3,4...а в 1-й-0,1,2,3,4, во 2-й-5,6,7,8,9 и т.д.
p.s.я могу вам намыло прислать картинку структуры
Что-то я не очень понимаю суть задания
Т.е. сделать что-то типа списка, только в основе его должен быть не один динамически изменяемый массив, а массив мелких массивов, например каждый по 5 элементов?
П.С. Сейчас на работе времени не много свободного, если подробнее и яснее опишете, что надо, подумаем
в общем...
вот если просто массив на основе связанного списка.....
описываем так
struct Node
{
int *A=new int[100];
Node *next;
};
т.е.эл-ми списка являются эл-ты массива. Т.е в 0-й ячейке(эл-те списка)-A[0], в 1-й-А[1] и т.д. Вы согласны?
А мне нужно,чтобы в 0-й ячейке-был не один эл-т массива(например А[0]),а фрагмент массива(допустим размера 5),т.е. эл-ты А[0]A[1]...A[4]; в 1-й ячейке-следующий фрагмент массива(естественно таково же размера,т.е 5), т.е это эл-ты А[5]A[6]....A[9] и т.д. теперь понятно?
мне эту байду нужно завтра уже сдать(причем в билдере,со всякими стрингридами и т.д.;но мне бы хоть шаблон составить и описание ф-й)...на крайняк в четверг...а я вообще без понятия....
че то я не того про массив на основе списка ниписала
struct Node
{
int info;
Node *next;
};
а дальше то,что было там
Вроде суть понял, но чесно говоря даже в голову не может уложиться, где такой извратный список можно удачно применить , сегодня уже ухожу домой, если завтра на работе напряга с утра не будет, подумаю чутка, хотя не имея на руках продуманного алгоритма, наваять быстро красивое и быстрое решение врядли получится.
спасибо...
я тут написала....но не знаю,правильно ли это вообще....удаление совсем не доделанно.....может чего исправите....чего допишите....
[code]template <class T> class Node
{
public:
int ni; //кол-во эл-в в ячейке =6
int nj; //кол-во ячеек
T *mt;
int k,j;
class spisok
{
public:
spisok *next;
T *K;
spisok(){K=new T[5];}
~spisok (){delete []K;}
};
public:
spisok *root;
Node(int n,int m){k=0;j=0;ni=n;nj=m;mt=new T[ni*nj];root=NULL;}
~Node (){delete []mt;};
//Добавление элемента
void Add( T y)
{ div_t s; int l;
spisok *el=new spisok;
spisok *cur=root;
el->next=NULL;
if (root==NULL)
{ root=el;nj++; mt[k]=y;el->K[j]=mt[k];k++;j++;s=div(k,5);
l=s.quot;}
else
{if ((l)<=nj)
{mt[k]=y;el->K[j]=mt[k];if ((j<6)&(k<(ni*nj))){k++;j++; s=div(k,5);
l=s.quot;}}
else
{while (cur->next!=NULL)cur=cur->next; j=0;nj++;mt[k]=y;cur->K[j]=mt[k];k++;j++; s=div(k,5);
l=s.quot;
cur->next=el;
}}
};
int poisk(T f) //поиск
{
for (int p=0;p<k;p++)
if (mt[p]==f) return p;
return -1;
}
//удаление эл-та(не дописано)
void ydal( T y)
{int p; div_t s; int l,h; spisok *el=new spisok;
p=poisk(y);
if (p==-1)return;
s=div(p,6);
l=s.quot+1; //номер ячейки
h=s.rem; //номер эл-та в ячейке
for(int nj=0;nj<=j;nj++)
{for(int i=h+1;i<6;i++)
el->K[i-1]=el->K[i];}
k--;}
};
Ну вот что получилось, писал быстро, времени мало:
MyList.h
Код
Спасибо огромное....вот только мне удаление нужно не поиндексу, а по эл-ту....я решила добавить ф-ю поиска,что бы индекс найденного эл-та возвращался и тогда можно было бы удалять по индексу....для эл-м первой ячейки(т.е.для 5 эл-в)работает,а для остальных нет....может подскажите,что я не так написала..
Код
Ненадо никаких поисков, это через Ж...
Вот функция для удаления по значению элемента, а не по индексу:
Код
Теперь все ок...но если я удаляю из последнего фрагмента...вылетает ошибка
Хотя...вроде теперь уже не вылетает...спасибо....завтра пойду сдавать...если все будет ок,я вас как-то могу отблагодарить?
вот и еще вопрос...у меня ведь структура такая в проге(как на рисунке)? Я отчет по ней пишу....грубо говоря: сначала мы все делаем для одного фрагмента, а потом их как бы склеиваем...или как мне описать,что делаем потом?
При добавлении сначала заполняется первый фрагмент, потом когда он полон, создаётся второй, причем первый ссылается на второй и далее заполняется второй, потом третий и т.д.
При удалении элементы сдвигаются к началу, если последний фрагмент пустой, то он удаляется.
А вот еще...
template<class T>struct MyListFragment -это типа вложенная структура(а я могу вместо truct написать class ?)...или как вообще граммотно сказать (чтобы в отчет написать) что такое
template<class T>struct MyListFragment и template<class T>class MyList?
а еще я хочу перенисти сами ф-и из .h в .cpp,ну естественно их заголовки оставить в .h. а он мне ошибкуи выдает.перенос вообще возможен?
Вы знаете,все-таки при удалении(примерно на 5,10...но может и раньше выскакивает) выскакивает ошибка...указывает на последнюю строчку fragment = fragment->Next из ф-и void Remove(T value)...может подкорректируете
Структуру на класс можно поменять, тут, в принципе, без разницы.
По поводу ошибки - ну посмотрю, если еще не поздно
Чтобы убрать ошибку, в функции Remove вместо break; напишите return;