王道——双链表

/*
*下次再说                   
*
*结束时间:2022.03.15 19:26
/*
双链表
在王道书上,插入和删除的操作在p是最后一个结点的情况下是错误的
所以对操作进行了改进

按位、按值查找,同样还是O(n)

在敲的时候产生了一点错误的想法,例如返回第i个结点的函数实现时
自己老是想到下标i-1的结点,这里是双链表呀,没有下标的呦,下次不能这么想了

经过这几次的实现,自己对这个理解确实有了深的理解,DNole* 和DLinkList

我也在想,对于双链表,前插入是不是也可以像昨天一样,后插完事后,进行data交换

在进行插入时,要先修改s结点后面的指针
*/

#include<iostream>
using namespace std;

typedef struct DNode {
	int data;
	struct DNode* prior, *next;
}DNode,*DLinkList;

//在结点p后面插入结点
//思考:在p结点前面插入数据的话,可以参考单链表,后插并交换数据????
bool InsertDNode_behind(DNode* p, DNode* s) {
	if (p == NULL)
		return false;
	if (p->next == NULL) {//p是最后一个结点
		p->next = s;
		s->prior = p;
		s->next = NULL;
		return true;
	}
	//p是中间结点
	else {
		s->next = p->next;
		p->next->prior = s;
		//一定要先连接s后面的指针,其他顺序无所谓
		p->next = s;
		s->prior = p;
		return true;
	}
}

//删除结点p后面的结点
bool DeleteDNode_behind_p(DNode* p) {
	if (p == NULL)
		return false;
	if (p->next == NULL)
		return false;
	//p是中间结点
	else {
		DNode* s = p->next;
		p->next = s->next;
		s->next->prior = p;
		return true;
	}
}

//前插法输入创建双链表
bool InitDNode(DLinkList& DL) {
	DL = new DNode;//分配并返回,头结点
	DL->next = NULL;
	DL->prior = NULL;
	DNode* r = DL;//尾结点指针

	//这里第一次敲错了,不应该指向DL->next;
	//DL返回了头结点,next显示还是NULL,就会乱套

	int n;
	cout << "请输入结点个数:" << endl;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cout << "第" << i+1 << "个结点数值:" << endl;
		int e;
		cin >> e;
		DNode* s = new DNode;
		s->data = e;
		InsertDNode_behind(r, s);//直接借用
		r = s;
	}
	r->next = NULL;
	return true;
}

//输出双链表
bool printDNode(DLinkList L) {
	if (L->next == NULL)
		return false;//空表
	DNode* p = L->next;//头结点
	while (p != NULL) {
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
	return true;
}

//返回第i个结点
DNode *GetDNode(DLinkList L, int i) {
	if (L->next == NULL)
		return NULL;//空表
	DNode* p = L->next;//第一个结点
	int j = 0;//记位
	while (p != NULL&&j<i-1) {
		j++;
		p = p->next;
	}
	return p;
}

//删除第i个结点
bool DeleteDNode_behind(DLinkList& L, int i) {
	//删除第i个结点,那就找到第i-1个,然后删除i-1后面的结点
	DNode* p = GetDNode(L, i - 1);
	DeleteDNode_behind_p(p);
	return true;
}

int main() {

	DLinkList DL;
	InitDNode(DL);
	printDNode(DL);
	DNode *s=GetDNode(DL,3);
	cout << s->data << endl;
	DeleteDNode_behind(DL, 3);
	printDNode(DL);
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值