04-C. DS双向链表

04-顺序表和堆栈练习

题目描述
祖玛是一款曾经风靡全球的游戏,其玩法是:在一条轨道上初始排列着若干个彩色珠子,其中任意三个相邻的珠子不会完全同色。此后,你可以发射珠子到轨道上并加入原有序列中。一旦有三个或更多同色的珠子变成相邻,它们就会立即消失。这类消除现象可能会连锁式发生,其间你将暂时不能发射珠子。

给定轨道上初始的珠子序列,然后是玩家所做的一系列操作。你的任务是,在各次操作之后及时计算出新的珠子序列。

输入
第一行是一个由大写字母’A’~'Z’组成的字符串,表示轨道上初始的珠子序列,不同的字母表示不同的颜色。

第二行是一个数字n,表示玩家共有n次操作。

接下来的n行依次对应于各次操作。每次操作由一个数字k和一个大写字母描述,以空格分隔。其中,大写字母为新珠子的颜色。若插入前共有m颗珠子,位置0-m-1,则k ∈ [0, m]表示新珠子嵌入在轨道上的位置。


输出
输出共n行,依次给出各次操作(及可能随即发生的消除现象)之后轨道上的珠子序列。

如果轨道上已没有珠子,则以“-”表示。

输入样例
ACCBA
5
1 B
0 A
2 B
4 C
0 A

ABCCBA
AABCCBA
AABBCCBA

A

以下有四个方法
第三个方法存在编译错误,第四个方法存在溢出

#include<iostream>
#include<string.h>
using namespace std;

typedef struct node
{
   
   
 char data;
 node *prior;
 node *next;
}node;//创建双向链表结构体 

void init(node *N)//双链表初始化 
{
   
   
 	N->next=NULL;
 	N->prior=NULL;
 	
 	char datas[100];//开字符数组输入 
 	cin>>datas;
 	int l=strlen(datas);//数组长度 
 	int i=0;
 	
 	node *s;//临时数组储存数据 
 	while(l--)//尾插法,把字符串导入双链表中 
 	{
   
   
  		s=new node; s->prior=NULL; s->next=NULL;
  		s->data=*(datas+i);
  		s->prior=N; N->next=s;
  		N=s;
  		i++;
 	}
 	//尾巴 在双链表最后
 	node *tail;
 	tail=new node;
 	tail->prior=NULL;tail->next=NULL;
 	tail->prior=N;
 	N->next=tail;
}

void printnode(node *N)//定义打印函数 
{
   
   
 	if(N->next->next)//判断是否为空 
 	{
   
   
  		N=N->next;
  		while(N->next)
 		{
   
   
  			cout<<N->data;
  		 	N=N->next;
  		} 
 	}
 	else
  		cout<<"-";
 	cout<<endl;
}

node* insert(node *N,int step,char color)//创建插入函数,返回头指针 
{
   
   
 int i;
 node *H=N;//指向头 
 node *s;  //临时储存 
 for(i=0;i<step;i++)//找到位于step位置的节点 
  N=N->next;
  
 s=new node;
 s->next=NULL;
 s->prior=NULL;
 s->data=color;
 
 s->prior=N;//插入函数关键步骤,两边顾 
 s->next=N->next;
 N->next->prior=s;
 N->next=s;
 
 while(H->prior)//找到头 
  H=H->prior;
 return H;//返回头 
}

void find(node *N)//查找函数 !核心
{
   
   
 	node *k=N->next;//定义指针用于循环 
 	int flag;//标记次数 
 
 while(k->next->next)//从第一个非空节点开始扫描 
 //想要在一次操作里删除三个相等的颜色组:在最外面套个while重复筛查
 {
   
   
 	flag=1;
  	while((k->data)==(k->next->data))
  	{
   
   
   		flag++;//假如数据相等,次数++ 
   		k=k->next;//移动到下一个节点 
 	}
  	if(flag>=3)//假如次数大于等于三 
  	{
   
   
   		while(flag--)
   		{
   
   
    		k->next->prior=k->prior;//删除 
    		k->prior->next=k->next;
    		k=k->prior; 
    	}
    	if(N-&
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值