поменять элементы в связанном списке без доступа к нему? - PullRequest
0 голосов
/ 30 марта 2011

если у меня есть ссылка на элемент в связанном списке, как мне поменять его со следующим элементом, в c

вот попытка,

Node* nRoot, *temp=pNode->next;
        nRoot=pNode;
        do{
            nRoot->next = temp->next;
            if(nRoot==pNode) pNode=temp;
            temp->next = nRoot;
            nRoot=nRoot->next;

        }while(nRoot!=NULL)||temp!=NULL);

но это не работает

Ответы [ 3 ]

1 голос
/ 30 марта 2011

Если у вас есть ссылка на A, а A-> next - B, вы можете сделать это. Я предполагаю, что они содержат указатель Data *, замените их данными. На самом деле не меняйте местами узлы, просто меняйте местами данные в узлах.

void push_forward(Node* curr) 
{
    Data* currData = curr->data;
    curr->data = curr->next->data;
    curr->next->data = currData; 
}

Для записи, Я не парень C , поэтому это может быть правильно только в алгоритме, но не в реализации. Я приветствую правки, исправления, предложения и конструктивные комментарии!

1 голос
/ 30 марта 2011

Вы можете сделать это только если это двойной связанный список.Вам нужен предыдущий указатель, чтобы вы могли указать его рядом со следующим.

Однако, если у вас есть эти данные, вы можете сделать что-то вроде этого:

Node* next       = curr->next;
Nide* prev       = curr->prev;
curr->prev       = next;
curr->next       = next->next;
curr->next->prev = curr;
next->prev       = prev;
next->prev->next = next;
next->next       = curr;

И 2 поменялись местами.

Редактировать: Конечно, вы можете сделать это с помощью односвязного списка, но вам нужно знать предыдущий узел, чтобы исправить его следующий указатель, чтобы он указывал на следующий текущий.

0 голосов
/ 30 марта 2011

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

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

Вам придется поменять узлыЭто означает, что вам нужно иметь указатель на узел, который предшествует тем, которые вам нужно поменять местами.Если у вас есть только заголовок списка, то функция подкачки может выглядеть примерно так:

void swap(Node **list, Node *first) {
    Node *i = *list;
    Node *p = NULL;

    while (i != NULL) {
        if (i == first) {
            Node *n = i->next;

            /* No next node to swap with */
            if (n == NULL)
                break;

            if (p != NULL) {
                p->next = n;
            } else {
                *list = n;
            }

            i->next = n->next;
            n->next = i;

            break;
        }

        p = i;
        i = i->next;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...