双向链表(自己写的c++类)

UVA还是上不去T T哭瞎了。

只好老老实实的研究上回买的书了。

写得有点长。好吧,我只是来复习C++类的。

特意用class 而不用struct写链表。

数据结构还没学。。。双向链表就当先预习了。

大神们轻喷。。T T


有一些小球,从左到右依次编号为1,2,3……n

你可以执行两种指令,其中A X Y表示把小球X移动到小球Y的右边,B X Y表示把小球X移动到小球Y的右边, X不等于Y

输入小球个数 n和指令条数m和m条指令,从左到右输出最后的序列。

样例输入:

6 2

A 1 4

B 3 5

样例输出:

2 1 4 5 3 6

我特意正反输出,验证了双向链表的完整性。

#include<iostream>
using namespace std;
class node
{
public:
	int data;
	int num;
	node *left,*right;
};

class link 
{
	node *head,*rear;
public:
	void newnode(int n);
	void display();
	void reverse_display();
	void move(char action,int a,int b);
	void del(node *p);
	void insertleft(node *p1,node *p2);//p1是插入的位置,p2是代插的位置,下同	
	void insertright(node *p1,node *p2);
	~link();
};

link::~link()
{
	node *p=head->right,*temp;
	if(p!=NULL)
	while(p->right!=NULL)
	{
		temp=p->right;
		delete p;
		p=temp;
	}
	delete head;
	delete rear;
}
void link::insertleft(node *p1,node *p2)//p1是插入的位置,p2是代插的位置
{
	if(p1==head)
	{
		p2->right=p1;
		p1->left=p2;
		head=p2;
		p2->left=NULL;
	}
	else 
	{
		node *temp=p1->left;
		temp->right=p2;
		p2->right=p1;
		p1->left=p2;
		p2->left=temp;
	}
}

void link::insertright(node *p1,node *p2)
{
	if(p1==rear)
	{
		p2->left=p1;
		p1->right=p2;
		rear=p2;
		p2->right=NULL;
	}
	else 
	{
		node *temp=p1->right;
		temp->left=p2;
		p2->left=p1;
		p1->right=p2;
		p2->right=temp;
	}
}	

void link::del(node *p)
{
	if(p==head)
	{
		head=head->right;
		head->left=NULL;
	}
	else if(p==rear)
	{
		rear=rear->left;
		rear->right=NULL;
	}
	else 
	{
		node *last=p->left,*next=p->right;
		last->right=next;
		next->left=last;
	}
	p->left=p->right=NULL;
}

void  link:: newnode(int n)
{
	node *p1,*p2;
	p1=p2=new node;
	head=p1;
	p1->left=p1->right=NULL;
	for(int i=0;i<n;i++)
	{
		p1->num=p1->data=i+1;
		if(i==n-1) 
		{
			rear=p1;
			break;
		}
		p1=new node;		
		p1->right=NULL;
		p1->left=p2;
		p2->right= p1;	
		p2=p2->right;
	}
}

void link::move(char action,int a,int b)
{
	node *p1,*p2;
	p1=p2=head;
	while(p1->num!=a&&p1!=NULL)
		p1=p1->right;
	while(p2->num!=b&&p2!=NULL)
		p2=p2->right;
	del(p1);
	if(action=='A')
		insertleft(p2,p1);	
	else 	
		insertright(p2,p1);	
}

void link::display()
{
	node* p1=head;
	while(p1!=NULL)
	{
		cout<<p1->data<<(p1->right==NULL?"\n" :" ");
		p1=p1->right;
	}
}

void link::reverse_display()
{
	node *p1=rear;
	while(p1!=NULL)
	{
		cout<<p1->data<<(p1->left==NULL?"\n" :" ");
		p1=p1->left;
	}
}

int main()
{
	int n,m;
	char action;
	cin>>n>>m;
	link s;
	s.newnode(n);
	while(m--)
	{
		int a,b;	
		//s.display();
		cin>>action>>a>>b;
		s.move(action,a,b);
	}
	s.display();
	s.reverse_display();
	return 0;
}



你可能感兴趣的:(双向链表(自己写的c++类))