【发布时间】:2017-12-07 20:20:11
【问题描述】:
我试图创建函数(swapNodes)来交换链表中的节点。
在这里,我存储了要交换的节点的前一个和下一个地址。
但是我的代码陷入了无限循环。
可以将此代码作为工作代码还是错误的方法?
#include<stdio.h>
#include<stdlib.h>
struct Node
{
int data;
struct Node *next;
};
void push(struct Node** head_ref, int new_data)
{
struct Node* new_node =
(struct Node*) malloc(sizeof(struct Node));
new_node->data = new_data;
new_node->next = (*head_ref);
(*head_ref) = new_node;
}
void printList(struct Node *node)
{
while(node != NULL)
{
printf("%d ", node->data);
node = node->next;
}
}
void swapNodes(struct Node** headr,int key1,int key2)
{
struct Node* temp1 = *headr;
struct Node* temp2 = *headr;
if(key1 == key2)
return;
struct Node* prev1 =NULL;
struct Node* next1 =temp1;
while(temp1->data !=key1 && next1 !=NULL)
{
prev1 =temp1;
temp1 =temp1->next;
next1 =temp1->next;
}
struct Node* prev2 =NULL;
struct Node* next2 =temp2;
while(temp2->data !=key2 && next2 !=NULL)
{
prev2 =temp2;
temp2 =temp2->next;
next2 =temp2->next;
}
if(next1 == NULL||next2 == NULL)
return;
prev1->next =temp2;
temp2->next =next1;
prev2->next =temp1;
temp1->next =next2;
}
int main()
{
struct Node *start = NULL;
push(&start, 7);
push(&start, 6);
push(&start, 5);
push(&start, 4);
push(&start, 3);
push(&start, 2);
push(&start, 1);
printf("\n Linked list before calling swapNodes() ");
printList(start);
swapNodes(&start, 4, 3);
printf("\n Linked list after calling swapNodes() ");
printList(start);
return 0;
}
【问题讨论】:
-
尝试在带有一些示例测试用例的调试器上运行。
-
如果您被允许交换数据,那么您可以这样做以避免由于指针操作而导致的错误。
-
@ilz0R 你指出的参考对这个问题没有用。
-
@Bhart Mittal 该函数具有未定义的行为,因为 temp1 或 temp2 可以等于 NULL。
-
虽然其中一个重复的问题被标记为 C++,但操作代码与 C 代码相同(但交换函数确实包含
cout << … << endl;行,它是纯 C++)。这涵盖了更一般的情况;纯 C 问题涵盖了交换相邻节点的更有限的情况。请注意,C++ 问题中的建议之一是交换有效负载而不是交换指针——这具有很大的优点,因为它可以在不需要知道交换节点之前的任何节点的情况下完成。
标签: c data-structures linked-list swap singly-linked-list