双向链表代码实现


#include<iostream>
using namespace std;
typedef int  ElementType;//定义类型
typedef struct DuLNode {
	ElementType  data;
	struct DuLNode * prior;//前继
	struct DuLNode * next;//后继
}DuLNode,* DuLinkList;

//1.初始化
bool InitList(DuLinkList L) {
	L = new DuLNode;
	L->prior = L;
	L->next = L;
	return true;
}

//2.创建列表 有表头结点
bool CreateList(DuLinkList & L) {
	cout << "How many number you wanna input?" << endl;
	int number=0,Data=0; cin >> number;
	DuLinkList p = L;
	if (number <= 0) return false;
	while (number--) {
		DuLinkList q = new DuLNode;
		cout << "input the data of this number" << endl; cin >> Data;
		q->data = Data;
		p->next = q;
		q->prior = p;
		q->next = L;
		L->prior = q;
		p = q;
	}
	return true;
}

//3.展示
void TraverseList(DuLinkList L) {
	DuLinkList p,q;
	p = new DuLNode;
	q = new DuLNode;
	p = L->next ;//首元结点
	if (p==L) { //只有一个头结点
		cout << "List Null" << endl;
	}
	else {
		cout << "The data is" << endl;
		while (p!=L) {
			cout << p->data << endl;
			p = p->next;
		}
	}
}

//10.确定第e个元素位置
DuLinkList   LocateElem(DuLinkList &L, int e) {//第e个元素的位置指针
	DuLinkList p = L->next;
	int i = 1;
	while ( p!=L && i<e) {
		p = p->next;
	}
		return p;
}

//4.确定元素位置
DuLinkList  LocateElem_value(DuLinkList L,int e) {//根据值确定对应位置
	DuLinkList p = L->next;
	int i = 1;
	while (p != L && p->data!=e) {
		p = p->next;
	}
	if(p->data==e)
	return p;
	else
		return NULL;
}

//5.插入链表
bool ListInsert(DuLinkList & L, int i, ElementType e) {
	DuLinkList p,s;
	if (!(p = LocateElem(L, i))) {
		return false;
	}
	
		s = new DuLNode;
		s->data = e;
		
		s->prior = p->prior;
		p->prior->next = s;
		
		s->next = p;
		p->prior = s;
		return true;
}

//6.链表的删除
bool DeleteList(DuLinkList &L, int i) {
	DuLinkList p = L->next;
	if (!(p = LocateElem(L, i))) return false;
	p->prior->next = p->next;
	p->next->prior = p->prior;
	delete p;
	p = NULL;
	return true;
}

//7.取值
bool GetElem(DuLinkList L, int i,ElementType & e) {
	DuLinkList p = new  DuLNode;
	p = L->next;
	int j = 1;
	while (p!=L && j < i) {
		p = p->next;
		++j;//次数增加
	}
	if (p==L || j > i)
		return false;
	else
		e = p->data;
		return true;
}

//8.销毁
void DestroyList(DuLinkList &L) {
	if (L->next=L) {
		cout << "List NULL" << endl;
	}
	else {
		DuLinkList p = L;//头结点
		delete p;
		p = NULL;
		cout << "destroy OK" << endl;
	}
}

//9.清空  只留下头
void ClearList(DuLinkList &L) {
	if (L->next==L) {
		cout << "List NULL" << endl;
	}
	else {
		DuLinkList p, q;
		p = new DuLNode;
		p = L->next;
		while (p !=L) {
			q = p->next;
			delete p;
			p = q;
		}
		L->next = L;
		L->prior = L;
		cout << "clear OK" << endl;
	}
}

合并重点思想:合并2各线性表仅需要将第一个表的尾指针指向第二个表的第一个结点,第二个表的尾指针指向第一个表的头结点,然后释放第二个表的头结点。


//10.合并2个循环列表
void MergeList(DuLinkList &L1, DuLinkList &L2) {

	if (InitList(L1))
		cout << "顺序表初始化成功" << endl;
	else cout << "顺序表初始化不成功" << endl;
	if (CreateList(L1)) cout << "顺序表创建成功" << endl;
	else cout << "顺序表创建不成功" << endl;
	TraverseList(L1);



	if (InitList(L2))
		cout << "顺序表初始化成功" << endl;
	else cout << "顺序表初始化不成功" << endl;
	if (CreateList(L2)) cout << "顺序表创建成功" << endl;
	else cout << "顺序表创建不成功" << endl;
	TraverseList(L2);



	DuLinkList A=L1->prior, B = L2->prior,p;//A,B都是尾指针
	p = B->next->next;//L2的首元结点
	delete B->next;//释放第二个表的头结点

//第二个表的尾指针指向第一个表的头结点
	B->next = A->next;
	A->next->prior = B;
	
//第一个表的尾指针指向第二个表的第一个结点
	A->next = p;
	p->prior = A;
	cout << "结果是" << endl;

	TraverseList(L1);
}
int main() {
	DuLinkList  myList = new DuLNode;
	DuLinkList  myList2 = new DuLNode;
	int i; ElementType e, x;
	cout << "1.初始化\n";
	cout << "2.创建\n";
	cout << "3.展示" << endl;
	cout << "4.确定元素位置\n";
	cout << "5.插入链表\n";
	cout << "6.链表的删除\n";
	cout << "7.取值\n8.销毁\n9.清空  只留下头\n10.合并2个循环列表\n0.退出\n";
	int choice = -1;
	while (choice != 0) {
		cout << "\nchoice=" << endl;
		cin >> choice;
		switch (choice) {
		case 1: //初始化
			if (InitList(myList))
				cout << "顺序表初始化成功" << endl;
			else cout << "顺序表初始化不成功" << endl;
			break;
		case 2://创建
			if (CreateList(myList)) {
				cout << "顺序表创建成功" << endl;
				break;
			}
			else
				cout << "顺序表创建不成功" << endl;
			break;
		case 3://展示
			TraverseList(myList);break;
		case 4://4.确定元素位置
			cout << "查找的数字:" << endl;
			cin >> x;
			if (LocateElem(myList, x)==NULL) {
			cout << "查无此数字" << endl;
			}
			else
			cout << "查找成功,要找的数字结点的位置是" << LocateElem_value(myList, x) << endl;
			break;
		case 5://5.插入链表
			cout << "要插入的位置和值分别是:" << endl; 
			cin >> i >> e;
			if (ListInsert(myList, i, e)) {
				cout << "插入成功" << endl;
			}
			else
				cout << "插入失败" << endl;
			break;

		case 6://6.链表的删除
			cout << "要删除的位置分别是:" << endl; cin >> i;
			if (DeleteList(myList, i)) {
				cout << "删除成功" << endl;
				}
				else 
					cout << "删除失败" << endl;
					break;
		case 7://7.取值
			cout << "输入第i(整数)个元素" << endl;
						cin >> i;
						if (GetElem(myList, i, e) ) {
							cout << "第" << i << "个元素是" << e << endl;
						}
						else if (!GetElem(myList, i, e))
							cout << "顺序表取值失败,overflow" << endl;
						break;
		case 8://8.销毁
			DestroyList(myList);
					break;
		case 9://9.清空
			ClearList(myList);
				break;
		case 10:MergeList(myList,myList2 );
			break;
		}
	}
}

拓展:常规的循环链表的合并案例:
在循环链表中设立尾指针而不设立头指针,可以使得操作简单,合并2各线性表仅需要将第一个表的尾指针指向第二个表的第一个结点,第二个表的尾指针指向第一个表的头结点,然后释放第二个表的头结点。对于循环链表只需要改变2个指针值就可以了

/*
设置尾指针的循环链表的合并只需要改变两个指向表尾的指针即可。 
*/
void  Combine(LinkListLast L1,LinkListLast L2){
	struct LNode *p;
	p=L2.rear->next->next;
	L2.rear->next=L1.rear->next;
	L1.rear->next=p;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

广大菜鸟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值