双链表的主要操作

双链表的结构体定义

typedef struct DLNode{
	int data;
	struct DLNode* prior;//指向前驱结点的指针
	struct DLNode* next;//指向后继结点的指针
}DLNode;

 

采用尾插法建立双链表

void CreateDlistR(DLNode *&L,int n) {
	DLNode* s, * r;
	int i;
	L = new DLNode;
	L->prior = NULL;
	L->next = NULL;
	r = L;            //和单链表一样,r始终指向链表的终端结点,刚开始头结点也是终端结点

	for (i = 0; i < n; i++) {
		s = new DLNode;        //创建新结点
		cin >> s->data;
        
        //下面三句将s插入到L的尾部,并且r指向s,s->prior=r;这一句是与建立单链表不同的地方
		r->next = s;
		s->prior = r;
		r = s;
	
	}

	r->next = NULL;

}

 

查找结点

     在双链表中查找一个值为x的结点,从第一个结点开始,边扫描边比较,若找到这样的结点,则返回结点的指针,否则返回NULL.

DLNode* findNode(DLNode* L, int x) {

	DLNode* p = L->next;    //一开始让p指向L链表的开始结点
	while (p != NULL) {
		if (p->data == x)
			break;
		p = p->next;
	}

	return p;//如果找到,则p中内容是结点地址;如果没找到,则p是NULL,
            
}

 

插入结点

假设在双链表中p所指的结点之后插入一个结点s

void insertNode(DLNode *&L,int i,int j) {
	DLNode* p = L->next;
	DLNode* s;


	while (p != NULL) {//这个循环框架其实就是查找操作的框架
		if (p->data == i) {
			

			s = new DLNode;
			s->data = j;
            
            //核心语句就是下面这四句
			s->next = p->next;
			s->prior = p;
			p->next = s;
			s->next->prior = s;//如若是插入最后一个元素的后面,则把这行去掉
			break;
			
		}
		p = p->next;
	}

}

 不太好理解的话,看下我画的图


 

 删除结点

假设删除双链表中p结点的后继结点

void DeleteNode(DLNode*& L, int i) {
	DLNode* p = L->next;
	DLNode* q;
	while (p != NULL) {
		if (p->data == i) {
			q = p->next;        //让q指针指向p->next也就是我们要删除的结点
			p->next = q->next;    //让p->next指针指向了要删除的元素的下一个元素的地址
			q->next->prior = p;    //让要删除的元素的下一个元素的prior的指针指向p结点
			delete q;    
		}

		p = p->next;
	
	}

}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值