双向链表(自己写的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; }
新 blog : www.hrwhisper.me