5

リンク リスト内の 2 つの隣接するノードのアドレスを交換しようとしています。int temp 変数を使用してそれらの値を交換しようとしましたが、完全に正常に動作します。しかし今、ポインターを介して 2 つのアドレスを交換したいと考えています。残念ながら、while ループ内に無限ループが作成されました。ここに私のコードスニペットがあります:

int の使用: //完全に問題なく動作しました

node* swapNumbers(node* head, int data){
    int temp;
    node *cursor = head;

    while(cursor!=NULL){
        if(cursor->data == data){
            temp = cursor->data;
            cursor->data = cursor->next->data;
            cursor->next->data = temp;
            //printf("1: %d\n", cursor->data);
            //printf("2: %d\n", cursor->next->data);

            return cursor;      
        } 
        cursor = cursor->next;
    }
    return NULL;
}

アドレスの使用: // これにより、無限ループが作成されました。

node* swapNumbers(node* head, int data){
    node *temp = NULL;
    node *cursor = head;

    while(cursor!=NULL){
        if(cursor->data == data){
            temp = cursor;
            cursor = cursor->next;
            cursor->next = temp;
        return cursor;      
        } 
        cursor = cursor->next;
    }
    return NULL;
}

私のtypedef構造体には以下が含まれています:

typedef struct node
{
    int data;
    struct node* next;
} node;

私は C が初めてで、ポインターはまだ私を混乱させています。どんな助けでも大歓迎です!

4

3 に答える 3

1

無限ループに入らないようにするには、先行値をcursor別のポインターが指す一時的な値に保存する必要があります。

于 2013-07-09T13:48:21.540 に答える
0

1 つずつリンクされたリストで 2 つのノードを交換する簡単な方法を提案できますか?

/* p points to the node before a, a and b are the nodes to be swapped */
void swap_address(node* p, node* a, node* b) 
{
    node* n = b->next; /* save the address of the node after b */

    if (!p || !a || !b)
    {
        printf("One of the arguments is NULL!\n");
        return;
    }

    p->next = b; /* p points to b */
    b->next = a; /* b points to a */
    a->next = n; /* a points to the node that was originally after b */
}

私のマシンでは、次の構造体定義で試してみました。

typedef struct node
{
    struct node* next;
    int val;
} node;

そして、私はそれを次のように使用しました:

swap_address(b, c, d);

ノードがありましたhead-> a-> b-> c->dこの順序で値が 1、2、3、4 でした。

スワップ後、順序は 1 -> 2 -> 4 -> 3 に変更されました。

これはあなたが求めているものですか?

于 2013-07-09T14:50:49.237 に答える
0

コードで処理する必要がある 3 つのケースがあります。

  1. データノードが最初のノードの場合。ヘッドポインタを変更する必要があります。ポインターのみを渡しているため、変更できません。それ以外の場合、head は 2 番目の要素です。

  2. データ ノードが最後のノードの場合。交換はできません。

  3. データ ノードが中間ノードの場合。カーソルの前が必要なので、適切なノードを指すことができます。前のノードがあると仮定します

        if(cursor->data == data)
        {
            temp = cursor;
            cursor = cursor->next;
            if (NULL == cursor)
                return NULL;
            temp->next = cursor->next;
            prev->next = cursor;
            cursor->next = temp;
            return cursor;      
        } 
    
于 2013-07-09T14:08:34.873 に答える