LINUX.ORG.RU

[C/C++] выбор элемента списка без поиска по всему списку


0

2

Все добрых суток.

Допустим есть структура:

struct m{
     int id;
     int val;

     struct m *next;   // сразу добавил для работы в списке
};

Можно ли сделать обращение к элементу списка таких структур, таким же быстрым как к элементу массива, если я точно знаю номер элемента массива, id равно n+1'ому элементу массива.

К примеру

struct m arr[10]; // 10ть элементов 
struct m *list;   // указатель на первый элемент списка

Я знаю что мне нужен элемент с id = 5, тогда для массива я просто обращаюсь к элементу arr[4], для списка же мне придётся перебирать все элементы list пока я не найду нужный c id равным 5ти.

Можно ли как сразу обратиться к 5-му элементу?

Заранее спасибо!

★★★★★

Последнее исправление: cyclon (всего исправлений: 1)

Если для общего случая для id (любой) - то нет.

Если для частного случая (id всегда от 0 до 10 например). то надо сделать массив указателей на структуру, и заполнять его в зависимости от id.

Т.е. в начале все указатели - нули. Добавляется структура с id=2 - в массив[2] кладёшь указатель на структуру. list не нужен.

nanoo_linux
()
Ответ на: комментарий от nanoo_linux

хотя list можно оставить. но всё равно за массивом надо следить, что-бы там «дохлых» указателей не оставалось.

nanoo_linux
()
Ответ на: комментарий от nanoo_linux

10 элементов это для примера, по сути их будет много и не всегда одно и то же количество

думал делать через malloc, что то типа

for(int i = 0; i++; i < 10)
     memcpy(list,(u_char *) + i*(sizeof(struct m)), sizeof(struct m));

но уж больно криво

cyclon ★★★★★
() автор топика
Ответ на: комментарий от nanoo_linux

>Если для частного случая (id всегда от 0 до 10 например). то надо сделать массив указателей на структуру, и заполнять его в зависимости от id.

Ну так можно заодно сделать динамический массив. Если увеличивать его в меру крупными кусками, то дополнительный оверхэд на изменение размера массива будет не такой и страшный.

anonymous
()
Ответ на: комментарий от cyclon

>думал делать через malloc, что то типа

for(int i = 0; i++; i < 10)

тут недавно тред был как раз про такую конструкцию.

anonymous
()
Ответ на: комментарий от anonymous

тут недавно тред был как раз про такую конструкцию.

Ну, иногда такая запись к плохим вещам не приведет, например, вот два эквивалента:

for(i = -10; i < 0 ; i++)
и
for(i = -10; i++; i < 0)
(правда, во втором случае можно было бы i<0 и не писать =) ) Но, конечно, ни к чему хорошему такое не приведет...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от anonymous

> тут недавно тред был как раз про такую конструкцию.

Это где неудачник ныл о сложной ошибке, которую сложно обнаружить в коде?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.