【问题标题】:bubble sort linked list, swapping pointers. C冒泡排序链表,交换指针。 C
【发布时间】:2012-02-17 13:34:24
【问题描述】:

我正在尝试使用冒泡排序交换单链表的两个指针。 我已经制作了比较功能,并且效果很好。 在交换函数中,交换运行良好,我设法在节点和node->next 之间进行交换,虽然链表“丢失”了节点的信息(交换之后),所以第一个节点在链表是node->next。 我正在使用一个通用函数来进行冒泡排序并调用比较函数和交换函数。

知道为什么会这样吗?

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;  
}

【问题讨论】:

  • 这个问题可以通过调试器解决。
  • j参数有什么用?
  • j=i+1,我需要交换的第二个节点的“地方”。 havnt 确实在代码中找到了它的用途,但由于硬件说明,我不得不将其保留在这里
  • 我尝试过使用调试器,尽管我尝试的每一件事都给了我同样的问题。

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


【解决方案1】:

为了交换两个节点 (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 实际上一个节点时才能执行此交换。 (因此:有一个 o->next 指针),所以你需要特殊的代码来处理 a 是链头的情况。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-02-10
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多