0

我必须编写一个程序,该程序基本上会对链表中的节点进行排序。我有 5 个函数需要为此作业编写,但我被困在其中一个函数上。我遇到问题的功能是交换两个节点。该函数的标头如下:

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

只要两个节点不相邻,我就可以正常工作。我们有一个提供给我们的 list.h 文件,我们应该使用两个函数evictNode(struct lnode** head, struct lnode* node)void insertNode (struct lnode** head, struct lnode* prevNode, struct lnode* nodeToBeInserted). 这些函数也处理nextprevious指针的重新分配。如果它们彼此相邻,我只是不完全确定如何交换节点。我试过把它画出来,但我无法把它包起来。

哦,顺便说一句,我处理其余节点的方式是使用以下代码:

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) 有两个函数返回上一个/下一个指针

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 回答