Указатель возврата любого выбранного индекса в круговом односвязном списке

Я разработал этот код так, чтобы я мог получить указатель на любую позицию, которую хочет пользователь, в круговом односвязном списке, я использую cout для возврата указателя, мне нужен такой механизм, который я мог бы использовать его с другой моей функцией вместо того, чтобы переписывать весь код снова, для этого мне нужно что-то сделать с возвращаемым типом, который сейчас недействителен

Вот функция..

void pointer_to_node(int index){
    Node*temptr;
    temptr = new Node;
    temptr = firstptr;

    Node*temptr2;
    temptr2 = new Node;
    temptr2 = NULL;
    int count = 1;

    while (temptr!=temptr2){
        if(count==index){
            cout << "Required Pointer is : ";
            cout<< temptr;}

        count++;
        temptr2=firstptr;
        temptr=temptr->nextptr;
    }

    if (index>size_of_list())
    {
        temptr=NULL;
        cout<< "Can't You think in bounds. Take your NULL Pointer ";
        cout << temptr;
        delete temptr;
        delete temptr2;
    }
}

person Asad Irfan    schedule 14.12.2012    source источник
comment
заставить его вернуть Node *, на котором вы в конечном итоге   -  person im so confused    schedule 14.12.2012
comment
также при условии, что я вообще этого не читал, но в чем смысл проверки границ в круговом LL?   -  person im so confused    schedule 14.12.2012
comment
@ AK4749 на самом деле я дал возможность добавлять узлы пользователю, если он добавил только 3 узла и запросил указатель 4-го узла, тогда я даю НУЛЕВОЙ УКАЗАТЕЛЬ, хорошо, теперь я изменил его на Node * pointer_to_node (int index ), но он по-прежнему выдает ошибки и ничего не возвращает \предупреждение: управление достигает конца непустой функции| \   -  person Asad Irfan    schedule 14.12.2012


Ответы (1)


Вам просто нужно вернуть Node *.

Однако, пока вы это делаете, вам также действительно нужно удалить эти строки: temptr = new Node;, а также delete, так как вы теряете там память. Вы просто немедленно отбрасываете эти новые узлы, переназначая указатели. delete в конце полностью удалят неправильные узлы и в любом случае вызываются не во всех случаях.

И если вы передадите индекс 0, ваш цикл действительно может занять очень много времени.

Я предполагаю, что у вас есть веская причина хотеть вернуть NULL, если вы зацикливаетесь на списке.

Что-то вроде следующего должно быть достаточно:

Node *pointer_to_node(int index)
{
    Node *temp = firstptr;
    while(index-- != 0) {
        temp = temp->nextPtr;
        if(temp == firstptr) return NULL;
    }
    return temp;
}
person JasonD    schedule 14.12.2012
comment
до сих пор не возвращается??? я изменил тип возвращаемого значения на Node pointer_to_node(int index) и получаю ошибку |82|ошибка: преобразование из Node*' to non-scalar type Node запрошено| - person Asad Irfan; 14.12.2012
comment
Тип возвращаемого значения должен быть Node*, а не Node. - person JasonD; 14.12.2012
comment
я сначала изменил его на NODE * и забыл написать cout .. готово .. спасибо ... как мне проголосовать за ваш ответ - person Asad Irfan; 14.12.2012