2016-12-20 8 views
-1

1つのリンクリストでノードを交換する際に問題があります。私のコードは現在、どちらのノードもリストの先頭ではないときに動作します。1つのリンクリストで2つのノードを交換する

EDIT:私はADTについて学習しているので、関数の入力と出力を変更することはできません。

typedef struct textbuffer *TB; 

struct textbuffer { 
    char *data; 
    TB next; 
}; 

void swapTB(TB tb, int pos1, int pos2) { 
    if (tb == NULL || pos1 == pos2) return; 
    int totalLines = linesTB(tb) - 1; 
    if (pos1 < FIRST_LINE || pos1 > totalLines || pos2 < FIRST_LINE || pos2 > totalLines) { 
     printf("Error: line number out of range, %d-%d.\n", FIRST_LINE, totalLines); 
     abort(); 
    } else { 
     TB all = tb; 
     int i = 0; 
     TB prevX = NULL; 
     TB currX = tb; 
     while (i != pos1) { 
      prevX = currX; 
      currX = currX->next; 
      i++; 
     } 

     int j = 0; 
     TB prevY = NULL; 
     TB currY = tb; 
     while (j != pos2) { 
      prevY = currY; 
      currY = currY->next; 
      j++; 
     } 

     if (prevX != NULL) { 
      prevX->next = currY; 
     } else { 
      all = currY; //update head of list 
     } 

     if (prevY != NULL) { 
      prevY->next = currX; 
     } else { 
      all = currX; //update head of list 
     } 

     TB temp = currY->next; 
     currY->next = currX->next; 
     currX->next = temp; 
    } 
    //return all; 
} 

私は(すべて、このケースでは)TBを返すように機能するように変更した場合、それが動作するため、ノードを交換する私の方法が正しいことを知っています。

私の質問は、void関数を使用して、関数の取り込みを変更せずに行う方法です。私は頭のポインタが必要だと思いますか?しかし、どうすればそれを使うことができますか?

+1

このコードは非常に複雑です。 BTWは[mcve]を提供してください。 –

+0

'TB'は非表示のポインタですか?さもなければ、その可視性/有効範囲は 'swapTB'関数に限定されます。 – LPs

+1

これらの情報をあなたの投稿に追加してください。 – LPs

答えて

0

2つのことを実行します。 - 関数内の構造体テキストバッファの受け渡しアドレス。主に

空隙swapTB(TB * TB、INT POS1、POS2 INT)

(): -

swapTB(TB、POS1、POS2)。

また、あなたのcurrxをチェックし、NULLをカレーするかどうかを確認してください。

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

TB head=NULL; 

void swapNodes(TB head_ref, int x, int y) 
{ 
    if (x == y) return; 
    head = head_ref; 

    struct node *prevX = NULL, *currX = head_ref; 
    while (currX && currX->data != x) 
    { 
     prevX = currX; 
     currX = currX->next; 
    } 

    struct node *prevY = NULL, *currY = head_ref; 
    while (currY && currY->data != y) 
    { 
     prevY = currY; 
     currY = currY->next; 
    } 

    if (currX == NULL || currY == NULL) 
     return; 

    if (prevX != NULL) 
     prevX->next = currY; 
    else 
     head = currY; 

    if (prevY != NULL) 
     prevY->next = currX; 
    else 
     head = currX; 

    struct node *temp = currY->next; 
    currY->next = currX->next; 
    currX->next = temp; 

} 

int main() 
{ 
    TB start=NULL; 
    // Create linked list here 

    swapNodes(start, pos1, pos2); 

    print_linkedlist(head); // print the linked list after swap 

    return 0; 
} 
+0

'TB ** tb' - >' TB * tb' ...なぜtypedefでポインタを隠さない方がよいかの例 – LPs

+0

@LPs私はポインタのアドレスを渡しています。シングルポインタのアドレスを渡すようにOPにアドバイスしたので、シングルポインタの。 –

+0

'typedef struct textbuffer * TB;' ....... – LPs

関連する問題