BJFU_数据结构习题_233双向循环链表中结点的交换

欢迎登录北京林业大学OJ系统
http://www.bjfuacm.com

233双向循环链表中结点的交换

描述
利用双向循环链表表示一个整数序列,指定一个结点位置用p指向该结点,交换p所指向的结点及其前驱结点的顺序。
输入
多组数据,每组数据有三行,第一行为链表的长度n,第二行为链表的n个元素(元素之间用空格分隔),第三行为p所指向的结点位置。当n=0时输入结束。
输出
对于每组数据分别输出一行,依次输出交换结点顺序后的链表元素,元素之间用空格分隔。
输入样例 1
5
44 11 22 33 55
3
6
22 33 11 66 44 55
6
0
输出样例 1
44 22 11 33 55
22 33 11 66 55 44

#include
#include
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef struct LNode
{
	int data;
	struct LNode *next;
	struct LNode *prior;
}LNode,*LinkList;
int InitList_L(LinkList &L,int n)
{
  	L=new LNode;	
	L->next=NULL;
	LinkList H=L;
	L->prior=L;
	L->next=L;
	while(n--)
	{
		LinkList p=new LNode;
		cin>>p->data;
		p->next=L->next;
		L->next=p;
		p->prior=L;
		p->next->prior=p;
		L=p;
	}
	L=H;
	return OK;
}
void Exchange(LinkList &L,int key)
{
	LinkList p=L;
	while(key--)
		p=p->next;
	p->prior->next=p->next;
	p->prior->prior->next=p;
	p->next=p->prior;
	p->prior=p->prior->prior;
	p->next->prior=p;
	p->next->next->prior=p->next;
	p=L->next;
	while(p->next&&p->next!=L)
	{
		cout<<p->data<<" ";
		p=p->next;
	}
	cout<<p->data<<endl; 
}
int main()
{
	int n,key;
	LinkList L;
	while(cin>>n&&n!=0)
	{
	 	InitList_L(L,n);
		cin>>key;
		if(n==1)
		{
			cout<<L->next->data<<endl;
			continue;
		}
		Exchange(L,key);
	}
	return 0;
}

你可能感兴趣的:(BJFU_数据结构,北林数据结构习题)