数据结构作业保存2-2双向循坏列表的建立,删除,插入,移动

我特么终于把这个打出来了!感动得不能自已!

双向循坏列表------看上去好容易哦!就是把这个指向那个,那个指向这个,对不对??

MD,一打完全是两回事!

先上题目-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

学校有一个神奇的机器,它里面的数据呈环状排列。机器有以下的6种操作:
 
1,使得操作位置向顺时针移动一位。
 
2,使得操作位置向逆时针移动一位。
 
3,删掉操作位置顺时针方向的下一位。如果机器中没有数据,不做操作。
 
4,删掉操作位置逆时针方向的下一位。如果机器中没有数据,不做操作。
 
5,往操作位置顺时针的下一位插入一个元素。如果机器中没有元素,那么操作位置移动到该插入元素上。
 
6,往操作位置逆时针的下一位插入一个元素。如果机器中没有元素,那么操作位置移动到该插入元素上。
 
现在机器中有一组长度为n的数据,我们希望知道对这些数据进行m次操作以后的序列情况。
 
Input
第一行输入一个整数n (1 <= n <= 400000),表示机器数据的个数。
 
第二行输入n个整数,每个数均在[-10000,10000]范围内,描述机器中现存数据情况,数据按顺时针顺序输入。
 
第三行输入一个整数p,表示前面输入数中第p个数所在位置为机器当前的操作位置。
 
第四行输入一个整数m (1 <= m <= 400000),表示待进行的操作数量。
 
接下来的m行输入操作,操作为1,2,3,4,5,6,分别对应题目中描述的操作类型。若为操作5或操作6,则其后再输入一个整数,表示插入元素的值。
Output
在机器完成所有操作后,从机器当前操作位置起,顺时针输出机器中现存所有数据元素,元素间以空格分隔,最后一个元素后紧跟一个回车。


Sample Input
4
1 2 3 4
3
7
1
5 9
6 8
5 74
3
4
2
Sample Output
3 4 9 1 2

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

#include<iostream>
#include<cstring>
#include <malloc.h>          //我刚开始想用动态数组存,这是动态数组的头文件,后来发现不用动态数组也可以,这个也就留着当个摆设
#include <stdlib.h>
using namespace std;


struct link{
int dd;
link*next;
link*pre;
};


static int nodeNum=0;
link*head,*current;
int dataNum=0,num,opNum;


void meau();
void init();
void find(int num);
link*creat(int dat);
void add(int dat);
void addF(int dat);
void addB(int dat);
void delateF();
void delateB();
void moveF();
void moveB();
void diaplay();


void display(){
while(nodeNum>1){
cout<<current->dd;
cout<<' ';
current=current->next;
nodeNum--;
}
if(head==NULL)   //这个情况是我刚开始没考虑到的,也就是没有结点,当然什么也就不输出啦
return;
else
cout<<current->dd;
}
void moveB(){
current=current->next;
}
void moveF(){
current=current->pre;
}
void delateB(){
if(head==NULL)
return;
else if(current->pre==current->next){          //只有两个及一个结点的情况
current->next->pre=NULL;
current->next->next=NULL;
current->next=current;
current->pre=current;
if(nodeNum==1){         //只有一个结点了,要删除它,就直接初始化就行啦
init();
}
}

else{
current->next->next->pre=current;
current->next->pre=NULL;
current->next=current->next->next;
}
nodeNum--;
}
void delateF(){
if(head==NULL)
return;
else if(current->pre==current->next){
current->pre->next=NULL;
current->pre->pre=NULL;
current->next=current;
current->pre=current;
if(nodeNum==1){
init();
}
}
else{
current->pre->pre->next=current;
current->pre->next=NULL;
current->pre=current->pre->pre;
}
nodeNum--;
}
void add(int dat){ //add,之前是没有这个函数的,我直接把addB加上这个函数中IF(node---)这个条件,用addB来一起用,但后来发现这样的话,在此添加
link*tp; //结点时会有问题,比如我输入了3个数,dataNum==nodeNum,现在删除一个数字,那么dataNum<nodeNum,再次添加一个
if(head==NULL) //数,就会走IF这个条件,指针会移动,就不符合题目要求了。我们仅仅需要输入的初始数字是一个接一个,后面操作是插入
head=current=creat(dat);
else if(current->next==current){
tp=creat(dat);
tp->pre=current;
current->next=tp;
tp->next=current;
current->pre=tp;
if(nodeNum<dataNum) current=current->next;
}
else{
tp=creat(dat);
current->next->pre=tp;
tp->next=current->next;
current->next=tp;
tp->pre=current;
if(nodeNum<dataNum) current=current->next;
}
nodeNum++;
}
void addB(int dat){
link*tp;
if(head==NULL)
head=current=creat(dat);
else if(current->next==current){
tp=creat(dat);
tp->pre=current;
current->next=tp;
tp->next=current;
current->pre=tp;
}
else{
tp=creat(dat);
current->next->pre=tp;
tp->next=current->next;
current->next=tp;
tp->pre=current;
}
nodeNum++;
}
void addF(int dat){
link*tp;
if(head==NULL)
head=current=creat(dat);
else if(current->pre==current){
tp=creat(dat);
current->pre=tp;
tp->next=current;
tp->pre=current;
current->next=tp;
}
else{
tp=creat(dat);
current->pre->next=tp;
tp->pre=current->pre;
current->pre=tp;
tp->next=current;
}
nodeNum++;
}
link*creat(int dat){
link*p=new link();
p->dd=dat;
p->next=p;
p->pre=p; //刚开始我另它指向空,后来我觉得我让它指向自己方便些
return p;
}
void find(int inum){
link*thead=head;
for(int i=1;i<inum;i++){
thead=thead->next;
}
current=thead;
}
void meau(){                                        
int op=0;       
int data1,data2;
cin>>op;
switch(op){
case 1:moveB();break;
case 2:moveF();break;
case 3:delateB();break;
case 4:delateF();break;
case 5:cin>>data1;addB(data1);break;
case 6:cin>>data2;addF(data2);break;
default:break;
}
}
void init(){
head=current=0;
}
int main(){
int a;
cin>>dataNum;
for(int i=0;i<dataNum;i++){
cin>>a;
add(a);
}
cin>>num;
find(num);
cin>>opNum;
while(opNum>0){
meau();
opNum--;
}
display();
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值