冒泡排序链表,交换指针。 C

时间:2012-01-24 09:34:48

标签: c pointers swap bubble-sort singly-linked-list

我正在尝试使用冒泡排序交换单链表的两个指针。 我已经做了比较功能,并且它的工作正常。 在swap函数中,交换工作正常,我设法在节点和node->next之间交换,虽然链表“丢失”节点的信息(交换后),所以第一个节点在链接列表中是node->next。 我正在使用一个通用函数来执行冒泡排序并调用compare函数和交换函数。

知道为什么会这样吗?

void swap_arr(void **arr,int i , int j)
{

  Team *teamList = (Team*) arr ;    
  Team *teamI = (Team*) arr , *teamJ ;
  Team *temp ;
  Team *temp1;
  int z;


  // Receives instead i
  for(z=0; z<i; z++)
    teamI = teamI->next;

  //teamJ is the i+1    
  teamJ =  teamI->next;

  temp = teamI;
  temp1 = teamJ->next;


  teamI = teamJ ;

  teamJ = temp;

  if (temp1->next->next==NULL)
     teamJ->next = NULL;
  else
     teamJ->next = temp1->next;

  teamI->next = teamJ;

   if (temp1==NULL)
     teamJ->next=NULL;
  else
     teamJ->next = temp1;  
}

2 个答案:

答案 0 :(得分:3)

对于交换两个节点(a,b),您需要访问指向第一个节点的“外部”节点(o)。 (并且在a和b之后还有一个节点p。(p也可以是NULL,但这并不重要)

旧情况:

o->next == a
a->next == b
b->next == p

新情况:

o->next == b
b->next == a
a->next == p

如果实际上 节点,则只能执行。 (因此:有一个o->下一个指针),所以你需要特殊的代码来处理a是链头的情况。

但是没有:o-&gt; next只是一个“struct llist *”,因此可以使用任何指向llist的指针。在大多数情况下,最简单的解决方案是为交换函数使用指针指针参数;指向指针的指针既可以指向链的头部,也可以指向某个节点的 - >下一个指针。

答案 1 :(得分:0)

我还尝试使用冒泡排序实现链表的排序,尽管您可以在代码中进行修改而不是编写交换功能,您只需在代码中交换它们,并且每次需要时都需要指向相邻节点的3个不同指针。您可以找到已实施的代码here