sniper::p
Зарегистрирован: 04.10.2005 Сообщения: 237 Откуда: rus/73
|
Добавлено: Пн Окт 10 2005 21:09 Заголовок сообщения: |
|
|
Вообще двусвязный список - это структура из одинаковых элементов, каждый из которых содержит как минимум 2 поля (чаще 3): указатель на следующий элемент и на предыдущий. Также имеется указатель на "голову" списка - первый элемент. Если список пуст - то этот указатель - NULL (т.е. нулевой). Может также иметься указатель на последний элемент списка - хвост.
pHead-->|data,pNext,pPrev|--><--|data,pNext,pPrev|-->NULL
Примерно так можно изобразить его графически. Ну а сам код, для того чтоб с ним работать - это заезжанная тема из книги. Берешь, например, Кернигана и читаешь.
Но могу показать пример объявления такой структуры.
Код: | struct Item{ // для простоты оформлено как стуктура
int data; // данные
Item *pNext; // указатель на такой же элемент в списке (след.)
Item*pPrev // указатель на предыдущий
}
// Объявляешь указатель на голову
Item *pHead;
// Теперь для примера покажу одну из функций по работе с ним
void Create()
{
pHead = NULL; // инициализация. Прежде, чем с ним работать, нужно ОБЯЗАТЕЛЬНО ИНИЦИАЛИЗИРОВАТЬ ЕГО НУЛЕМ
}
// Например, вставка в начало...
int FputFrontDEQl(int PutEl)
{
// сохраняем старый указатель на голову
SDEQList *pOldHead = pHead;
// выделяем память по формату
SDEQList *pnewEl = (SDEQList *) malloc(sizeof(SDEQList));
// указатель на новую голову - указатель на только что созданный элемент
pHead = pnewEl;
pHead->pPrev=NULL;
// указатель на новый следущий элемент - указатель на старую голову
pHead->pNext=pOldHead;
// а теперь устанавливаем новые связи между элементами
// если список не был пуст - то устанавливаем ссылку на предыдущий
if (pOldHead) pOldHead->pPrev=pHead;
// кладешь, собственно данные в только что выделенную память
pHeadL->data=PutEl;
};
| Но!!! Это, вообще-то, далеко не все. Все-таки надо почитать... Там лучше рассказано. И еще одно: чтоб лучше понять, как все это устроено - на каждой строчке рисуешь картинку, что куда у тебя пошло (в смысле указателей). И, кстати, с помощью класса было бы это все сделать удобней _________________ Нет предела совершенствованию |
|