`
hy2012_campus
  • 浏览: 30572 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类
最新评论

c++实现双连表

 
阅读更多
#include<iostream>
using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;							//Status 是函数返回值类型,其值是函数结果状态代码。
typedef int ElemType;						//ElemType 为可定义的数据类型,此设为int类型

typedef struct DuLNode
{
	ElemType data;							//结点的数据域
	struct DuLNode *prior;
	struct DuLNode *next;					//结点的指针域
}DuLNode,*DuLinkList;						//DuLinkList为指向结构体DuLNode的指针类型

Status InitDuList_L(DuLinkList &L){
	//构造一个空的双向链表L
	L=new DuLNode;							//生成新结点作为头结点,用头指针L指向头结点
	L->next=NULL;							//头结点的指针域置空
	L->prior=NULL;
	return OK;
}

DuLNode *GetElemP_DuL(DuLinkList L,int i){
	//在带头结点的双向链表L中查找第i个元素,返回结点的地址
	int j;
	DuLNode *p;
	p=L->next;j=1;							//初始化,p指向第一个结点,j为计数器
	while(j<i&&p){							//顺链域向后扫描,直到p指向第i个元素或p为空
		p=p->next;++j;
	}
	if(!p || j>i)	return NULL;			//第i个元素不存在
	return p;
}											//GetElemP_DuL

Status ListInsert_DuL(DuLinkList &L,int i,ElemType e){		//算法2.12 双向链表的插入
	//在带头结点的双向链表L中第i个位置之前插入元素e,i的合法值为1<=i<=表长+1
	DuLNode *s,*p;
	if(!(p=GetElemP_DuL(L,i)))				//在L中确定第i个元素的位置指针p
		return ERROR;						//p为NULL时,第i个元素不存在
	s=new DuLNode;							//生成新结点s
	s->data=e;								//将结点s数据置为e
	s->prior=p->prior;						//将结点s插入L中,需要修改4个指针域
	p->prior->next=s;
	s->next=p;
	p->prior=s;
	return OK;
}											//ListInsert_DuL

Status ListDelete_DuL(DuLinkList &L,int i,ElemType &e){		//算法2.13 双向链表的删除
	//删除带头结点的双向链表L中第i个位置之前插入元素e,i的合法值为1<=i<=表长
	DuLNode *p;
	if(!(p=GetElemP_DuL(L,i)))				//在L中确定第i个元素的位置指针p
		return ERROR;						//p为NULL时,第i个元素不存在
	e=p->data;								//保存被删结点的数据域
	p->prior->next=p->next;					//修改被删结点的前驱结点的后继指针
	p->next->prior=p->prior;				//修改被删结点的后继结点的前驱指针
	delete p;								//释放被删结点的空间
	return OK;
}											//ListDelete_DuL


void CreateDuList_L(DuLinkList &L,int n){
	//正位序输入n个元素的值,建立带表头结点的双向链表L,同时建立前驱指针
	DuLNode *r,*p;
	L=new DuLNode;
	L->next=NULL;								//先建立一个带头结点的空链表
	r=L;
	cout<<"请输入"<<n<<"个数\n";										//尾指针r指向头结点
	for(int i=0;i<n;i++){
		p=new DuLNode;							//生成新结点
		cin>>p->data;							//输入元素值
		p->next=NULL;r->next=p;					//插入到表尾
		r=p;									//r指向新的尾结点

		p->prior=L->prior;						//插入到表头
		L->prior=p;
	}
}												//CreateDuList_L

int main()
{
	int res,a,b,choose;
	DuLNode *L,*p;
	cout<<"1. 建立双向链表\n";
	cout<<"2. 输入数据\n";
	cout<<"3. 双向链表的插入\n";
	cout<<"4. 双向链表的删除\n";
	cout<<"5. 输出数据\n";
	cout<<"0. 退出\n\n";
	
	choose=-1;
	while(choose!=0)
	{
		cout<<"请选择:";
		cin>>choose;
		switch(choose)
		{
		case 1:		//建立一个双向链表
			if(InitDuList_L(L))
				cout<<"成功建立双向链表!\n";
			break;
		case 2:		//使用后插法创建双向链表
			CreateDuList_L(L,10);
			break;
		case 3:		//双向链表的插入
			cout<<"请输入两个数分别代表插入的位置和数值:";
			cin>>a>>b;
			if(ListInsert_DuL(L,a,b))
				cout<<"成功在"<<a<<"位置插入"<<b<<endl;
			else
				cout<<"插入失败!\n";
			break;
		case 4:		//双向链表的删除
			cout<<"请输入一个位置用来删除:";
			cin>>a;
			if(ListDelete_DuL(L,a,res))
				cout<<"删除成功!被删除的数是"<<res<<endl;
			else
				cout<<"删除失败!\n";
			break;
		case 5:		//双向链表的输出
			cout<<"现在的链表是:\n";
			p=L->next;
			while(p)
			{
				cout<<p->data<<" ";
				p=p->next;
			}
			cout<<endl;	
			break;
		}
	}
	return 0;
}

 

分享到:
评论

相关推荐

    java双连表

    本文将深入探讨如何在Java中实现双连表,包括泛型限制、增强For循环的使用以及如何模拟栈结构。 首先,让我们了解双连表的基本概念。每个节点在双连表中包含两个引用:一个指向前一个节点,另一个指向后一个节点。...

    一种抗震复合双连梁的制作方法.docx

    本文介绍的是一种抗震复合双连梁的制作方法,旨在解决现有双连梁施工工艺中难以保证水平通缝形成以及施工速度慢的问题。该方法通过优化结构设计,提升了双连梁的抗震性能和施工效率。 首先,这种抗震复合双连梁包括...

    matlab资源 使用动画演示在Python中实现的双连杆机械臂(2自由度)的简单控制 仅供学习参考用代码.zip

    在本资源中,我们主要探讨如何使用Python编程语言模拟并可视化一个双连杆机械臂(2自由度)的简单控制系统。Matlab虽然在工程计算和建模方面非常强大,但Python由于其开源、灵活和丰富的库支持,已经成为数据科学和...

    POJ3352-Road Construction 【Tarjan-边双连通分量-缩点】

    POJ3352-Road Construction 【Tarjan-边双连通分量-缩点】 解题报告+AC代码 http://hi.csdn.net/!s/0T8UO5 附:我所有的POJ解题报告链接 . http://blog.csdn.net/lyy289065406/article/details/6642573

    POJ3177-Redundant Paths 【Tarjan-边双连通分量-缩点】

    POJ3177-Redundant Paths 【Tarjan-边双连通分量-缩点】 解题报告+AC代码+测试数据 http://hi.csdn.net/!s/GPAY6Z 附:我所有的POJ解题报告链接 . http://blog.csdn.net/lyy289065406/article/details/6642573

    pcb图,双连电位器PCB图

    pcb图,双连电位器PCB双连电位器PCB图

    双连拱地铁隧道开挖支护技术

    通过改进工法解决广州地铁三号线支线某双连拱地铁隧道因设计不周、埋深浅、周边环境复杂等特殊工程条件,无法正常开挖中导洞的问题。使中导洞顺利开挖后,正线隧道顺利开挖支护。改进原设计方案中的CRD工法,利用正线...

    如何设置Windows 8双连屏全景主题.docx

    5. **调整壁纸设置**:然而,为了实现全景效果,还需要进一步设置。点击“桌面背景”或“背景”选项,找到“图片放置方式”或“图片布局”设置。在这里,选择“跨区”或“拉伸”选项。这样,壁纸会自动适应并跨越两...

    行业文档-设计装置-预制、现浇混合式双连梁.zip

    预制与现浇混合式双连梁是建筑结构设计中的一种创新技术,主要应用于大型桥梁、高层建筑以及其他需要承受复杂荷载的结构。...在实际工程中,这种技术的应用有助于实现更加经济、高效和可持续的建筑解决方案。

    银行双连门控系统(硬件设计).doc

    银行双连门控系统(硬件设计).doc

    考虑关节非线性的串联双连杆机械臂工业机器人运动控制.pdf

    "机器人运动控制中的串联双连杆机械臂非线性考虑" 机器人运动控制是机器人技术的核心部分,对于工业机器人的运动控制,需要考虑到多个因素,包括关节非线性、动力学耦合效应、轨迹跟踪误差等。考虑关节非线性是...

    图论- 图的连通性- Tarjan 求双连通分量.rar

    本资源“图论- 图的连通性- Tarjan 求双连通分量.rar”着重讨论了图的连通性以及一种用于求解双连通分量的著名算法——Tarjan算法。 首先,我们理解一下图的连通性。一个无向图是连通的,如果任意两个顶点之间都...

    双连拱S形互通隧道减缓隧道压力波的设计构想

    双连拱S形互通隧道设计的核心在于增大隧道内的空气流动空间,减少列车在行驶过程中遇到的气动阻力,从而在很大程度上减缓会车时产生的隧道压力波效应。隧道的设计考虑到了空气动力学中活塞效应的影响,即高速列车...

    设置Win8双连屏全景主题.docx

    在Windows 8操作系统中,创建一个令人震撼的双连屏全景体验是一项有趣且实用的设置。这个过程涉及到安装特定的全景主题以及调整系统显示设置,从而使得壁纸在整个双屏环境中无缝衔接,形成一个完整的视觉效果。以下...

    关节非线性的串联双连杆机械臂运动控制研究.pdf

    本文研究了关节非线性的串联双连杆机械臂运动控制,针对的是多轴工业机器人在执行任务时的轨迹跟踪误差问题。文章首先分析了导致多轴工业机器人轨迹跟踪误差的主要非线性因素,这些因素包括各轴上的关节非线性和不同...

    行业资料-交通装置-一种汽车用双连万向节.zip

    行业资料-交通装置-一种汽车用双连万向节.zip

    典型双连杆机械臂的PD控制的matlab仿真

    典型双连杆机械臂的PD控制的matlab仿真,非常适合初始学机械臂控制折者(This is the MATLAB simulation of PD control of a typical double link manipulator, which is very suitable for the original manipulator...

    AutoCAD设计图纸冠迪花园双连别墅施工图-dwg源格式.zip

    AutoCAD可以帮助设计师精确控制每个细节,实现个性化和创新的设计。 6. **毕业设计**:对于建筑或相关专业的学生来说,毕业设计是将理论知识转化为实践的重要环节。使用AutoCAD完成施工图,能帮助学生提升实际操作...

Global site tag (gtag.js) - Google Analytics