2017-07-04 94 views
0

我有这个链表如何交换C中链接列表中的两个节点?

struct Link 
{ 
    frame_t *frame; 
    struct Link *next; 
}; 

现在我想更换两个是与函数swap(),因此,例如交换节点(表4,7)会给我

[1, 2, 3, **7**, 5, 6, **4**, 8, 9, 10] 

对于用的

[1, 2, 3, **4**, 5, 6, **7**, 8, 9, 10] 

内容的列表清单我想这样做是我真正需要更换那些之前使用节点,但我得到了无限循环和节点医管局已被切断。

link_t* tmp = currPrev->next; 
link_t* tmpTwo = linkToChangePrev->next; 
tmpTwo->next = tmp->next; 
currPrev->next = tmpTwo; 
tmp->next = tmpTwo; 
linkToChangePrev->next = tmpTwo; 

什么是最有效的方式来更改链接列表中的两个节点?

+0

什么是“frame_t”,为什么指向它的指针在您的示例中表示为整数? – unwind

+0

https://stackoverflow.com/questions/1535988/swapping-nodes-on-a-single-linked-list – rsp

+0

尽管其中一个重复问题标记为C++,但操作代码与C代码相同(但交换函数确实包含一个'cout << ... << endl;'行,这是纯C++)。这涵盖了更一般的情况;纯粹的C问题涵盖了更加有限的交换相邻节点的情况。请注意,C++问题中的一个建议是交换有效载荷,而不是交换指针 - 这具有很大的优点,因为可以在交换节点之前不需要了解节点的任何信息。 –

回答

1

你的问题有点不足,如果要交换的元素出现多次,会发生什么情况?

假设它的确定只是交换第一的情况下,我肯定会写代码,做两个步骤:

  1. 查找拿着交换的数据元素。
  2. 交换它们。

也许是这样的:

const struct Node * find_node(const struct Node *list, frame_t *value) 
{ 
    while(list != NULL) 
    { 
    if(list->frame == value) 
     return list; 
    } 
    return NULL; 
} 

void swap(struct Node *list, frame_t *value1, frame_t *value2) 
{ 
    struct Node *el1 = (struct Node *) find_node(list, value1); 
    struct Node *el2 = (struct Node *) find_node(list, value2); 
    if(el1 != NULL && el2 != NULL) 
    { 
    const frame_t * const f1 = el1->frame; 
    el1->frame = el2->frame; 
    el2->frame = f1; 
    } 
} 

这将简单地交换两个首次发现的情况下,如果有重复。

+0

这会更好地向他展示重复的问题。 – tilz0R

+0

函数是不是应该将Link **作为输入,还是将指针返回给列表头?如果其中一项是头部,则列表的头部会改变。 –

+0

我读了这个问题,因为他希望根据*值*而不是列表中的位置找到要交换的项目。因此,您必须遍历列表以找到两个值的位置,然后交换 – JeremyP