20001.数据结构 C++ 双向链表

/*
	实现双向链表。
*/
#include<iostream>

typedef int ElemType;

typedef struct DuLnode {
	ElemType data;
	struct DuLnode* prior, * next;
}DuLnode, *DuLinklist;

bool InitList_L(DuLinklist& L) {
	/*
		初始化双向列表。
	*/
	L = new DuLnode;
	if (!L)
		return false;
	L->prior = NULL;
	L->next = NULL;
	return true;
}

bool CreateDuList_H(DuLinklist& L) {
	/*
		头插法创建双向链表。
	*/
	int n;
	DuLinklist s;

	std::cout << "请输入您要插入元素的个数" << std::endl;
	std::cin >> n;

	std::cout << "请以此输入您要插入的元素" << std::endl;
	std::cout << "头插法创建链表...." << std::endl;

	while (n--) {
		s = new DuLnode;
		if (!s)
			return false;
		std::cin >> s->data;
		s->next = L->next;
		s->prior = L;
		if(L->next)
			L->next->prior = s;
		L->next = s;
	}
	return true;
}

bool GetElem(DuLinklist L, int i, int& e) {
	/*
		双向链表取值;
	*/
	DuLinklist p;
	p = L->next;
	for (int j = 0; j < i - 1; j++) {
		if (!p)
			return false;
		p = p->next;
	}
	e = p->data;
	return false;
}

int LocateElem(DuLinklist L, int e) {
	/*
		在双向列表中查找元素。
	*/
	DuLinklist p;
	p = L->next;
	int j = 1;
	while (p && p->data != e) {
		p = p->next;
		j++;
	}
	if (!p)
		return 0;
	return j;
}

bool Print_DuList(DuLinklist L) {
	DuLinklist p;
	p = L->next;
	if (!p)
		return false;
	while (p) {
		std::cout << p->data << " ";
		p = p->next;
	}
	std::cout << std::endl;
	return true;
}

bool ListInsert_L(DuLinklist& L, int i, int& e) {
	/*
		在双向链表的第i个位置插入元素e;
	*/
	DuLinklist p, s;
	p = L->next;
	int j = 0;
	while (p && j++ < i) {
		p = p->next;
	}

	if (!p || j > i)
		return false;
	s = new DuLnode;
	s->data = e;

	p->prior->next = s;
	s->prior = p->prior;
	s->next = p;
	p->prior = s;
	return true;
}

bool ListDelete_L(DuLinklist& L, int i) {
	/*
		双向链表之删除元素。
	*/
	DuLinklist p;
	p = L->next;
	int j = 0;
	while (p && j < i-1) {
		p = p->next;
		j++;
	}
	if (!p || j > i)
		return false;
	if(p->next)
		p->next->prior = p->prior;
	p->prior->next = p->next;
	delete p;
	return true;
}
int main() {
	DuLinklist L;
	InitList_L(L);
	CreateDuList_H(L);
	Print_DuList(L);

	//int i, e;
	//std::cout << "请输入您要取得数的位置" << std::endl;
	//std::cin >> i;
	//GetElem(L, i, e);
	//std::cout << "您所取得数为:" << e << std::endl;

	//Print_DuList(L);
	
	//int e, i;
	//std::cout << "请您输入你要查找的元素" << std::endl;
	//std::cin >> e;
	//i = LocateElem(L, e);
	//std::cout << "您所查找的元素位于" << i << "位置" << std::endl;

	//int i, e;
	//std::cout << "请输入您要插入的元素的位置" << std::endl;
	//std::cin >> i;
	//std::cout << "请输入您要插入的元素" << std::endl;
	//std::cin >> e;
	//ListInsert_L(L, i, e);

	int i;
	std::cout << "请输入您要删除元素的位置" << std::endl;
	std::cin >> i;
	ListDelete_L(L, i);
	Print_DuList(L);
	return true;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

魂•殿

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值