codeup id=1814 剩下的树

数组成功运行


#include<iostream>
using namespace std;
typedef struct data
{
int number;
int k;
}data;
int main()
{
int time,N,l,r,l_flag,r_flag;
data a[10000];
int i,j,count,v;
while(cin>>N)
{count=0;
if(N<=0||N>10000)
break;
for(i=0;i<=N;i++)
{a[i].number=i;
 a[i].k=0;
}
cin>>time;
if(time>100||time<=0)
break;
for(v=0;v<time;v++)
{	cin>>l>>r;
  for(i=0;i<=N;i++)
  {
	if(l==a[i].number)
	l_flag=i;
	if(r==a[i].number)
	r_flag=i;
  }

//cout<<"L="<<l_flag<<endl;
//cout<<"R="<<r_flag<<endl;
for(i=0;i<=N;i++)
{ if(a[i].k==0&&(a[i].number>=l_flag&&a[i].number<=r_flag))
   a[i].k=-1;

   //cout<<i<<"="<<a[i].k<<endl;
  }
}
for(i=0;i<=N;i++)
if(a[i].k==0)
{//cout<<a[i].number<<endl;
count++;}
//cout<<"sum="<<count<<endl;
cout<<count<<endl;
}
}

换成链表后超时(此方法与数组相同标记删除区域)

#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct node
{int  data;
 int k;
 struct node* next;
}NODE,*PNODE;
//创建链表
 /********创建链表 *****/
 void creatlist(PNODE S,PNODE P,int m)
 {

 		for(int j=0;j<=m;j++)
 	 	{	S=(PNODE)malloc(sizeof(NODE));
  			S->data=j;
			S->k=0;
			P->next=S;
  			P=P->next;
  		}
		  P->next=NULL;
	}
  /********遍历链表 *****/
int traverse_list(PNODE r)
{
		while(r->next!=NULL)
		{
			r=r->next;
			cout<<r->data<<" ";
			}
				cout<<endl;
  return 0;
}
  /********遍历链表 *****/
int traverse_list2(PNODE r,int &count)
{
		while(r->next!=NULL)
		{
			r=r->next;
			if(r->k==0)
			{//cout<<r->data<<endl;
			count++;
			}
			}
			cout<<count<<endl;
  return 0;
}

  /********链表查找元素 *****/
int flagElement(PNODE Phead,PNODE r,int e1,int e2,int m)//链表头参考点,遍历指针,查找值,链表区间值 ,返回指针
{	r=Phead;
	while(r!=NULL)
	{
	if((r->data>=e1&&r->data<=e2)&&r->k==0)
	r->k=-1;
	r=r->next;
}
	return 0;
  }

int main()
{PNODE Phead,S,P,R;
int N,time,l,r,count;
   
    while(cin>>N)
    {
   if(N>10000||N<1)
   break;
	Phead=S=P=R=NULL;
    count=0;
    Phead=(PNODE)malloc(sizeof(NODE));
	P=Phead;
  	creatlist(S,P,N);//创建链表
    R=Phead;
    //traverse_list(R);//遍历链表
    cin>>time;
    if(time>100||time<1)
    break;
    for(int t=0;t<time;t++)
    {cin>>l>>r;
	for(int i=0;i<=N;i++)
	 flagElement(Phead,R,l,r,N);
	}
	   R=Phead;
 	traverse_list2(R,count);//遍历链表
 }
    return 0;
}

下面是链表删除结点的方法提交有错误

#include<iostream>
#include<stdlib.h> 
#define Maxsize 1000
using namespace std;
typedef struct node
{ struct node* prior;
  struct node* next;
	int data;
}NODE,*PNODE;
  /********遍历链表 *****/
int traverse_list(PNODE r,PNODE L)
{
   	  	r=L;
		while(r->next!=NULL)
		{	
			r=r->next;
			printf(" %d",r->data);
		}
  return 0;
}
  /********链表节点统计*****/
int court_list_node(PNODE r,PNODE L,int &x)
{       
   	  	r=L->next;
		while(r!=NULL)
		{
			x++;
			r=r->next;
		}
  return 0;
}
  /********链表查找元素 *****/
int findElement_prior_next(PNODE L,PNODE r,int e,int m,int v,PNODE &K)//链表头参考点,遍历指针,查找值,链表区间值 ,返回指针
{	r=L;
    K=L;
	while(r!=NULL)
	{if(r->data==e)
	if(v==1)         
    K=r->prior;
    else if(v==2)
	K=r->next;
    r=r->next;
	}
	return 0;
  }
  


  /********创建链表 *****/
 void creatlist(PNODE S,PNODE P,int m)
 {
   
 		for(int j=0;j<=m;j++)
 	 	{	S=(PNODE)malloc(sizeof(NODE));
  			S->data=j;
  			P->next=S;
  			S->prior=P;
  			P=P->next;
  			//S=P->next;
			  
  		}
		   P->next=NULL;
	} 

	int main()
	{PNODE Phead,S,P,r,M1[Maxsize],M2[Maxsize],rear;
 	int m,left[Maxsize],right[Maxsize],NO;
 	int number=0;
 //	cout<<"输入数值范围0~m"<<endl;

	  while(cin>>m>>NO)
	  {if(m>10000||m<1)
	  break;
	 if(NO<0||NO>100)
	 break;
	 Phead=NULL;
	Phead=(PNODE)malloc(sizeof(NODE));//创建 表头 
 	P=Phead;
    M1[0]=M2[0]=Phead;
  	creatlist(S,P,m);//创建链表
  	 	//traverse_list(r,Phead);//遍历链表
  	//	cout<<endl;
  	//cout<<"输入几组区间"<<endl;
  	for(int i=0,v=1;i<NO;i++,v++)
  	{  //cout<<"输入第"<<v<<"组区间"<<endl;
     		cin>>left[i]>>right[i];
     		r=Phead;
  		 findElement_prior_next(Phead,r,left[i],m,1,M1[i]);
		 findElement_prior_next(Phead,r,right[i],m,2,M2[i]);
	}
	  	for(int i=0;i<NO;i++)
  	{  
	if(left[i]<=left[i-1]&&right[i]>=right[i-1])//后一个区间包含前一个区间
			{ M1[i]->next=M2[i];
		     M2[i]->prior=M1[i];}
		else if(left[i]>=left[i-1]&&right[i]<=right[i-1])
			{ M1[i-1]->next=M2[i-1];
		     M2[i-1]->prior=M1[i-1];}
		else if(left[i]>right[i-1])//后一个区间与前一个区间不相关
	   {M1[i]->next=M2[i];
		M2[i]->prior=M1[i];
		} 
		else if(right[i-1]>=left[i])//后区间左区域在前区间内
		{ M1[i-1]->next=M2[i];
		  M2[i]->prior=M1[i-1];
		}
		
	}

  	  //r=Phead;
     //  traverse_list(r,Phead);//遍历链表
    //  cout<<endl;
    //  cout<<"剩余节点数量"<<endl;
    number=0;
       court_list_node(r,Phead,number);
    	cout<<number<<endl;
    }
    return 0;
}















#include<iostream>
#include<stdlib.h> 
#define Maxsize 1000
using namespace std;
typedef struct node
{ struct node* prior;
  struct node* next;
	int data;
}NODE,*PNODE;
  /********遍历链表 *****/
int traverse_list(PNODE r,PNODE L,PNODE rear)
{
   	  	r=L;
		while(r->next!=rear)
		{	
			r=r->next;
		 printf(" -%d-",r->data);
		}
  return 0;
}
  /********链表节点统计*****/
int court_list_node(PNODE r,PNODE L,int &x,PNODE rear)
{       
   	  	r=L;
		while(r->next!=rear)
		{
			x++;
			r=r->next;
		}
	//	if(r->next==rear)
	//	x=0;
  return 0;
}
  /********链表查找元素 *****/
int findElement_prior(PNODE &L,PNODE &r,int e,PNODE rear,PNODE &K)//链表头参考点,遍历指针,查找值,链表区间值 ,返回指针
{   
     cout<<endl;
	 r=L;
    K=L;
	while(r!=NULL)
	{	if(r->data==e)
    	{	K=r->prior;break;
		}
 	else K=L;
	r=r->next;
	
	}
	cout<<"左边"<<K->data<<endl;
	return 0;
  }
    /********链表查找元素 *****/
int findElement_next(PNODE &L,PNODE r,int e,PNODE rear,PNODE &K)//链表头参考点,遍历指针,查找值,链表区间值 ,返回指针
{ //int flag;
  	  r=L;
    K=L;
	while(r!=NULL)
	{if(r->data==e)
	{K=r->next;break;}
 	else K=rear->prior;
    r=r->next;

	}
	cout<<"右边"<<K->data<<endl;
	return 0;
  }
  


  /********创建链表 *****/
 void creatlist(PNODE S,PNODE &P,int m)
 {
   
 		for(int j=0;j<=m;j++)
 	 	{	S=(PNODE)malloc(sizeof(NODE));
  			S->data=j;
  			P->next=S;
  			S->prior=P;
  			P=P->next;
  			//S=P->next;
  		}
		   P->next=NULL;
		  //rear->data=-1;
	      // rear->next=NULL;
	} 

	int main()
	{PNODE Phead,S,P,r,M1[Maxsize],M2[Maxsize],rear,front;
 	int m,left[Maxsize],right[Maxsize],NO;
 	int number=0,flag;
 //	cout<<"输入数值范围0~m"<<endl;

	  while(cin>>m>>NO)
	  {flag=0;
	  if(m>10000||m<1)
	  break;
	 if(NO<0||NO>100)
	 break;
	Phead=NULL;
	Phead=(PNODE)malloc(sizeof(NODE));//创建 表头 
 	P=Phead;
    M1[0]=M2[0]=Phead;
	creatlist(S,P,m);//创建链表
	rear=(PNODE)malloc(sizeof(NODE));
									 P->next=rear;
									 rear->prior=P;
									 rear->data=-1;
									 rear->next=NULL;
  	 	traverse_list(r,Phead,rear);//遍历链表
  	cout<<endl;
  	//cout<<"输入几组区间"<<endl;
  	for(int i=0,v=1;i<NO;i++,v++)
  	{ cout<<"输入第"<<v<<"组区间"<<endl;
     		cin>>left[i]>>right[i];
     if(left[i]==0&&right[i]==m)
			flag=1;
  			if(flag==0)
			{
				r=Phead;
  		 findElement_prior(Phead,r,left[i],rear,M1[i]);
		 findElement_next(Phead,r,right[i],rear,M2[i]);
		  M1[i]->next=M2[i];
		  M2[i]->prior=M1[i];
		  r=Phead;
		   traverse_list(r,Phead,rear);//遍历链表

	}
if(flag==0)
{	 r=Phead;
cout<<"末尾遍历\n"<<endl;
          traverse_list(r,Phead,rear);//遍历链表
     cout<<endl;
      cout<<"剩余节点数量"<<endl;

	     number=0;
       court_list_node(r,Phead,number,rear);
    	cout<<number<<endl;
}
else if(flag==1)
	      cout<<0<<endl;
}

}
    return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值