0

基本的にリンクされたリスト内のノードをソートするプログラムを作成する必要があります。この課題のために記述する必要がある 5 つの関数があり、そのうちの 1 つに行き詰まっています。私が問題を抱えている機能は、2 つのノードを交換することです。関数のヘッダーは次のとおりです。

void swap (struct lnode** head, struct lnode* n1, struct lnode* n2)

2 つのノードが隣り合っていない限り、これは正しく機能します。list.h ファイルが提供されており、 と の 2 つの関数を使用することになっていevictNode(struct lnode** head, struct lnode* node)ますvoid insertNode (struct lnode** head, struct lnode* prevNode, struct lnode* nodeToBeInserted)。これらの関数は、nextおよびpreviousポインターの再割り当ても処理します。ノードが隣り合っている場合、ノードを交換する方法が完全にはわかりません。私はそれを描いてみましたが、私の心を包み込むことができませんでした.

ところで、残りのノードを処理する方法は次のコードです。

evictNode(head, n1);
evictNode(head, n2);
insertNode(head, n1prev, n2);
insertNode(head, n2prev, n1);

編集:試み

struct lnode* temp = n2;
insertNode(head,n1prev,temp)
evictNode(head, n2)

struct lnode* n1prev = nodeGetPrev(n1) 前/次のポインターを返す 2 つの関数があります。

4

1 に答える 1

1

次のようにします。

struct lnode* tmp = nodeGetPrev(n1);
/*
 * Remove n1 and insert it before n2
 * note to calling nodeGetPrev(n2) after removing n1
 */
evictNode( head, n1 );
insertNode( head, nodeGetPrev(n2), n1 );
/* If n2 were before n1 and we insert n1 before n2, swap is done */
if( tmp != n2 ) {
    evictNode( head, n2 );
    insertNode( head, tmp, n2 );
}
于 2012-10-09T00:09:13.713 に答える