正文

<算法 i~iv>-3.432008-03-09 17:12:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/zhaoyg/33252.html

分享到:

////////////////////////////////////////////
//  <算法 i~iv>
// 
//  Exercise : 3.43  , Page : 75
//  exercise description:
//   实现一个程序,互换一个双向链表中两个给定的节点的位置.
//  
//  P.S: 对于相邻节点尚未考虑,还需几行代码即可
//  zhaoyg   2008.2.
////////////////////////////////////////////


#include <iostream>

using namespace std;

const int times = 10;

struct node 
{
 int item;
 node *prev;
 node *next;

 node (int value , node *p , node *n)
 {
  item = value;
  prev = p;
  next = n;
 }
};

void creat_node(node **head,int times);
void test_list(node *temp);
void transposition(node **head,int item_1,int item_2);
void free_list(node *head);

int main()
{
 node *head = NULL;
 node *temp;
 int item_a,item_b;

 cout <<"请输入需要交换节点的位置,用空格分隔\n当前链表中共有"<<times<<"个节点"<<endl;
 cin >> item_a >> item_b;
 
 creat_node (&head,times);

 temp = head->next ;
 
 test_list(temp);//display

 transposition(&head,item_a,item_b); //transposition

 cout <<"\n\nAfter transposition"<<endl;

 temp = head->next ;
 test_list(temp);//display
 
 free_list(head);
 system("pause");
 return 0;
}

void creat_node(node **head , int times)  //times 控制分配节点的个数
{
 node *current = NULL;
 int value=0;

 while (value<times)
 {
  if (*head == NULL)
  {
   *head = new node ( 0 , current , NULL );
   current = *head;
  }
  else
  {
   current->next = new node ( ++value , current , NULL );
   current = current->next;
  }
 }
}


void test_list(node *temp)//测试双向链表
{
 cout<<"顺序显示:"<<endl;
 for (int i=0;i<times;i++)
 {
  cout<<temp->item<<",";
  if (temp->next !=NULL)
   temp=temp->next;
 }

 cout<<"\n逆序显示:"<<endl;
 for (int j=0;j<times;j++)
 {
  cout<<temp->item<<",";
  temp=temp->prev;
 }
}

void transposition(node **head,int item_x,int item_y)
{
 node *x,*y;
 node *t_next,*t_prev;

 x = y = *head;

 for (int i = 0;i<item_x;i++)
  x = x->next ;

 for (int j = 0; j<item_y;j++)
  y = y->next ;

 t_next = x->next ;
 t_prev = x->prev ;

 x->next = y->next ;
 y->next = t_next ;

 x->prev = y->prev ;
 y->prev = t_prev ;

 y->prev->next = y;
 y->next->prev = y;
 x->prev->next = x;

 if (x->next !=NULL)  //当两个待换位节点中的之一不是最后一个节点时
  x->next->prev = x;
}

void free_list(node *head)
{
 node *current=head,*temp;

 while (current!=NULL)
 {
  temp=current->next;
  free(current);
  current=temp;
 }
}

阅读(1765) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册