双链表的插入、删除、查找等操作

#include<iostream>
#include<cstring>
#include <set>
#include <map>
#include <ctime>
#include <bitset>
#include <sstream>
#include <algorithm>
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>//getch()的头文件
#include<vector>
#include<queue>
#include<stack>
using namespace std;
// 带头结点的双链表的创建、遍历、删除
typedef struct DNode{
	int data; // 数据域
	struct DNode *prior,*next;// 前驱和后继指针 
}DNode,*DLinkList; 
void isEmpty(DLinkList &L){// 判断双链表是否为空 
	if(L->next==NULL){
		cout<<"当前双链表为空"<<endl;
	}else{
		cout<<"当前双链表非空"<<endl; 
	}
}
bool InsertNextDNode(DNode *p,DNode *s){// 插入后续结点的函数,其中p为任意结点,s为插入结点 
	if(p==NULL||s==NULL){
		return false;
	}
	s->next=p->next;
	if(p->next!=NULL){// 如果p 是最后一个结点 
		p->next->prior=s;
	}
		s->prior=p;
		p->next=s;
	return true;
}
bool DeleteNextNode(DNode *p){// 删除结点p的后继结点的函数,其中p为任意结点 
	if(p==NULL) return false;// 如果这个待删除结点为NULL 返回false 
	DNode *q=p->next;// 判断是否为最后一个结点 
	if(q==NULL) return false;
	p->next=q->next;
	if(q->next!=NULL)
		q->next->prior=p;
	free(q);
	return true; 
}
void ReadDLinkList(DLinkList &L){// 传递的是地址的引用,这里的L为双链表的头接点 
	DNode * M= (DNode*) malloc(sizeof(DNode));// 初始化一个结点指针,并且该结点指针指向头结点L  
	M=L;
	while(M->next!=NULL){
		M=M->next;// 头结点不携带任何数据,因此一开始需要后移 
		cout<<M->data<<"\t";
	}
	cout<<endl;
} 

DLinkList InitDLinkList(DLinkList &L){// 初始化双链表 
	L = (DNode *) malloc(sizeof(DNode));
	if(L==NULL){
		return false;
	}
	L->prior=NULL;// 头结点的前驱永远为NULL 
	L->next=NULL;// 头结点的后继为NULL表示暂时还没有后继元素 
	cout<<"依次输入整形的数据作为双链表的结点数据,并且以-1作为输入结束。"<<endl;
	int data;
	cin>>data;
	DNode * M =(DNode *) malloc(sizeof(DNode));// 这个结点作为L头结点的移动结点
	M=L;// M指向头结点L 
	while(-1!=data){
		DNode *temp = (DNode *) malloc(sizeof(DNode));// 初始化一个结点作为下一个插入结点
		temp->data=data;
		InsertNextDNode(M,temp);// 将这个结点插在M 结点后面
		M=M->next;// 结点M后移 
		cin>>data;
	}
	return L;
}


int GetLinkListLength(DLinkList &L){// 获取链表的长度
if(L->next==NULL)
	return 0;
int length=0;
// 为了不移动头结点,因此需要一个辅助结点来进行移动
DLinkList M=(DNode *) malloc (sizeof(DNode));
M = L;
while(M->next!=NULL){
	M = M->next;
	length++;
} 
return length;
}

void  SearchByPosition(DLinkList &L,int x){// 实现按位查找 
	int length = GetLinkListLength(L);
	if(length==0){
		cout<<"当前双链表的长度为0"<<endl;
		return ;
	}else{
// 为了不移动头结点,因此需要一个辅助结点来进行移动
DLinkList M=(DNode *) malloc (sizeof(DNode));
M = L;
int i =0;
while(x>length){// 如果 
	cout<<"\n查找位置超出链表长度,情重新输入。"<<endl;
cin>>x;
if(x<0){
	cout<<"\n输入非法,输入的值不能小于0,请重新输入。"<<endl;
	cin>>x;
} 
}
while(i<x){
M=M->next;
i++;
}
cout<<M->data;
}
return ;
}
void VerifyValue(DLinkList &L,int value){// 验证值是否在双链表中 
// 为了不移动头结点,因此需要一个辅助结点来进行移动
DLinkList M=(DNode *) malloc (sizeof(DNode));
M = L;
M=M->next;// 因为头结点一开始不携带数据 
while(M->data!=value&&M->next!=NULL){// 如果当前结点的值不为要查找的值,并且存在下一个结点 
M=M->next; 
if(M->data==value){
	cout<<"该值在链表中"<<endl; 
	return ;
}
}
cout<<"该值不在链表中"<<endl;
}



int main()
{	
	DNode *L;// 声明头结点指针L 
	L = InitDLinkList(L);// 初始化这个头结点
	ReadDLinkList(L);
	isEmpty(L);
	cout<<"\n按位查找,请输入要查找的第n个结点的值"<<endl;
	int i;
	cin>>i;
	SearchByPosition(L,i);
	cout<<"\n按值查找,请输入要验证的值"<<endl;
	int j;
	cin>>j;
	VerifyValue(L,j);
	cout<<"\n对双链表进行删除操作…"<<endl;
	while(L->next!=NULL){// 此操作删除了除头结点外的所有后继节点 
		DeleteNextNode(L);
	}
	isEmpty(L);
	free(L);	
	
return 0;
}



在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是牛大春呀

老板糊涂啊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值