C структуры + указатели+перемещение по структуре

TutanXamoN

Новичок
C структуры + указатели+перемещение по структуре

Есть вот такая замечательная структура по которой необходимо реализовывать перемещение.
PHP:
struct student
{
//data
struct student *prev,*next;
};
Способ 1(реализованный):
PHP:
void go_to(struct student **a, int pos)
{
	while((*a)->prev!=NULL)
	{
    	*a=(*a)->prev;
	}
	for(int i=0;i<pos;i++)
	{
    		if((*a)->next!=NULL)
        			*a=(*a)->next;
	}

}

int _tmain(int argc, _TCHAR* argv[])
{

 	struct student *stud;

    //....
    go_to(&stud,5);

}
Способ 2(размышления):
Хранить текущую позиция в списке и перемещаться от неё, а не проматывать список каждый раз на начало.

Способ 3(размышления):
Хранить двумерный массив указателей на каждую позицию с ёё номером.

Так как я в последнее время двинулся на оптимизаци - интересно Ваше мнение.
 

Alexandre

PHPПенсионер
мне нравится Вариант 2,
а почему не рассматривается вариант - хранить массив структур?
каково максимальное кол-во элементов в массиве?
 

TutanXamoN

Новичок
Мне он тоже кажется более привлекательным.
Кол-во элементов неизвестно.
Формулировка задачи подразумевает не хранения массива, а вот такое обращение:
PHP:
a->next=new struct student;
a->next->prev=a;
 

TutanXamoN

Новичок
fixxxer
Читаю) Но у меня не дерево, а линейный список с двусторонним перемещением.

-~{}~ 18.03.08 00:27:

Остановился на втором варианте:
PHP:
void go_to(struct student **a, int offset) 
{ 
		if(offset>0)
		{
			for(int i=0;i<offset;i++)
				if((*a)->next!=NULL)
					*a=(*a)->next;
		}
		else
		{
			offset*=-1;
			for(int i=0;i<offset;i++)
				if((*a)->prev!=NULL)
					*a=(*a)->prev;
		}
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    struct student *stud=NULL; 
	int pos,curr_pos;
    //.... 
    go_to(&stud,(-curr_pos+pos)); 

}
 

fixxxer

К.О.
Партнер клуба
а понял
ну тогда можно и так
хотя конечно это не шибко эффективный способ :) тут уместнее был бы хэш по номеру. а тут уже 2 способа - либо поизучать теорию, либо взять judy :)
еще конечно можно тупо realloc при необходимости на массив указателей, но мне это как-то сразу не нравится
 
Сверху