シングルチェーンテーブルおよびデュアルチェーンテーブル操作

12737 ワード

0.削除(単一チェーンテーブル)ノードpを削除するには、前のノードの位置を知る必要がある
node *searchPr(node *h,int k){//      k    
	
	node *p=h; 
	while(p->next!=NULL)//p          
	{
		if(p->next->data==k) return p;//  k,    p
		p=p->next; //p  
	}
	return NULL;//    k   ,   
}

void deletNode(node *h,int k){
	//          k   
	 //1.             
	 node *pr=searchPr(h,k);//    k        
	 //2.     
	 
	 node *p=pr->next;//p        
	 //2.2              
	 pr->next=p->next; 
	 p->next=NULL;//           
	 
	 //3.    
	 delete p; 
	  
}

0.1.ノード定義
typedef struct node{
	int data;//    
	
	node *next;//        
	node *pre;//         
}node;

1.チェーンテーブルの作成
node *creat(node *h,int n){
	node *p=h;
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;//          (    )
		node *s=new node;//    
		s->data=x;//              
		s->next=s->pre=NULL;
	 	
	 	p->next=s;
	 	s->pre=p;
	 	p=p->next;//p    
	 	
	}
	return p;//    
} 

2.チェーンテーブル遍歴
void show(node *h){//   
	//    
	
	node *p=h->next; 
	while(p!=NULL){
		cout<<p->data<<" ";
		//p    
		p=p->next; 
	} 
}
void show2(node *t,node *h){//   
	//    
	node *p=t;
	while(p!=h){
		cout<<p->data<<" ";
		p=p->pre;
	}
}

3.チェーンテーブル挿入
void insertRight(node *p,node *s){
	//   
	node *aft=p->next; 
	p->next=s;
	s->pre=p;
	s->next=aft;
	
	if(aft!=NULL){
		aft->pre=s;
	}
}
void insertLeft(node *p,node *s){
	//   
	 
	node *q=p->pre;
	s->next=p;
	s->pre=q;
	
	p->pre=s;
	
	if(q!=NULL){
		q->next=s;
	}
}