单链表及双链表操作

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;
	}
}

猜你喜欢

转载自blog.csdn.net/Joseph_tony/article/details/107443357