栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

双链表的基本操作(CC++)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

双链表的基本操作(CC++)

文章目录
  • 前言
  • 一、双链表的操作
    • 1、双链表节点描述
    • 2、创建双链表
    • 3、双链表的插入(在p节点之后插入s节点)
    • 4、双链表的删除(删除p节点的后继节点q)
  • 二、使用方法


前言

双链表的基本操作:创建双链表、插入节点、删除节点


一、双链表的操作 1、双链表节点描述
//双链表节点描述
typedef struct DNode {
	ElemType data;//节点元素
	DNode* prior, * next;//节点前后两个指针
}DNode, * DLinklist;
2、创建双链表
//创建双链表
void CreateDLinkList(DLinklist& L) {
	int x;
	DNode* s, * r;
	L = (DNode*)malloc(sizeof(DNode));
	if (L == NULL) {
		cout << "创建失败..." << endl;
	}
	L->next = NULL;
	L->prior = NULL;
	r = L;
	cout << "请输入:(输入9999结束)" << endl;
	cin >> x;
	while (x != 9999) {
		s = (DNode*)malloc(sizeof(DNode));
		s->data = x;
		r->next = s;
		s->prior = r;
		r = s;
		cin >> x;
	}
	r->next = NULL;
	cout << "创建成功..." << endl;
}
3、双链表的插入(在p节点之后插入s节点)
//双链表的插入(在p节点之后插入s节点)
void InsertNextDNode(DNode* p, DNode* s) {
	if (p == NULL || s == NULL) {
		cout << "参数有误..." << endl;
		return;
	}
	s->next = p->next;
	if (p->next != NULL) {
		p->next->prior = s;
	}
	p->next = s;
	s->prior = p;
	cout << "插入成功..." << endl;
}
4、双链表的删除(删除p节点的后继节点q)
//双链表的删除(删除p节点的后继节点q)
void DeleteNextDNode(DNode* p) {
	if (p == NULL) {
		cout << "参数有误..." << endl;
		return;
	}
	DNode* q = p->next;
	if (q == NULL) {
		cout << "无后继节点..." << endl;
		return;
	}
	p->next = q->next;
	if (q->next != NULL) {
		q->next->prior = p;
	}
	free(q);
	cout << "删除成功..." << endl;
}
二、使用方法
#include

using namespace std;
typedef int ElemType;

//双链表节点描述
typedef struct DNode {
	ElemType data;//节点元素
	DNode* prior, * next;//节点前后两个指针
}DNode, * DLinklist;

//创建双链表
void CreateDLinkList(DLinklist& L) {
	int x;
	DNode* s, * r;
	L = (DNode*)malloc(sizeof(DNode));
	if (L == NULL) {
		cout << "创建失败..." << endl;
	}
	L->next = NULL;
	L->prior = NULL;
	r = L;
	cout << "请输入:(输入9999结束)" << endl;
	cin >> x;
	while (x != 9999) {
		s = (DNode*)malloc(sizeof(DNode));
		s->data = x;
		r->next = s;
		s->prior = r;
		r = s;
		cin >> x;
	}
	r->next = NULL;
	cout << "创建成功..." << endl;
}

//双链表的插入(在p节点之后插入s节点)
void InsertNextDNode(DNode* p, DNode* s) {
	if (p == NULL || s == NULL) {
		cout << "参数有误..." << endl;
		return;
	}
	s->next = p->next;
	if (p->next != NULL) {
		p->next->prior = s;
	}
	p->next = s;
	s->prior = p;
	cout << "插入成功..." << endl;
}

//创建节点
DNode* CreatNode() {
	DNode* s;
	int e;
	cout << "请输入节点元素:" ;
	cin >> e;
	s = (DNode*)malloc(sizeof(DNode));
	s->data = e;
	return s;
}

//按值查找表节点
DNode* LocateElem(DLinklist L) {
	DNode* s;
	int e;
	cout << "请输入你要在哪个元素后执行:" ;
	cin >> e;
	s = L->next;
	while (s != NULL && s->data != e) {
		s = s->next;
	}
	return s;
}

//双链表的删除(删除p节点的后继节点q)
void DeleteNextDNode(DNode* p) {
	if (p == NULL) {
		cout << "参数有误..." << endl;
		return;
	}
	DNode* q = p->next;
	if (q == NULL) {
		cout << "无后继节点..." << endl;
		return;
	}
	p->next = q->next;
	if (q->next != NULL) {
		q->next->prior = p;
	}
	free(q);
	cout << "删除成功..." << endl;
}

//打印双链表
void PrintList(DLinklist L) {
	DNode* s;
	s = (DNode*)malloc(sizeof(DNode));
	int i = 1;
	s = L->next;
	while (s)
	{
		cout << "第" << i++ << "节点 " << s->data << endl;
		s = s->next;
	}
}

//菜单
void menu(DLinklist& L) {
	int n;
	do {
		cout << "tt双链表操作菜单tt" << endl;
		cout << "tt1.创建双链表tt" << endl;
		cout << "tt2.双链表的插入tt" << endl;
		cout << "tt3.双链表的删除tt" << endl;
		cout << "tt4.打印双链表tt" << endl;
		cout << "tt5.退出tt" << endl;
		cout << "请输入序号:" ;
		cin >> n;
		switch (n)
		{
		case 1:CreateDLinkList(L);
			break;
		case 2:
			InsertNextDNode(LocateElem(L),CreatNode());
			break;
		case 3:DeleteNextDNode(LocateElem(L));
			break;
		case 4:PrintList(L);
			break;
		case 5: return;
		default:
			cout << "输入错误..." << endl;
			break;
		}
	} while (true);
}
int main() {
	DLinklist L;
	menu(L);
	cout << "程序已结束运行...";
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/868999.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号