#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实现双连表: 1.泛型限制; 2.增强for循环可用; 3.模拟栈结构;
matlab资源 使用动画演示在Python中实现的双连杆机械臂(2自由度)的简单控制 仅供学习参考用代码
POJ3352-Road Construction 【Tarjan-边双连通分量-缩点】 解题报告+AC代码 http://hi.csdn.net/!s/0T8UO5 附:我所有的POJ解题报告链接 . http://blog.csdn.net/lyy289065406/article/details/6642573
pcb图,双连电位器PCB双连电位器PCB图
通过改进工法解决广州地铁三号线支线某双连拱地铁隧道因设计不周、埋深浅、周边环境复杂等特殊工程条件,无法正常开挖中导洞的问题。使中导洞顺利开挖后,正线隧道顺利开挖支护。改进原设计方案中的CRD工法,利用正线...
设置Win8双连屏全景主题.docx
如何设置Windows 8双连屏全景主题.docx
关节非线性的串联双连杆机械臂运动控制研究.pdf
图论- 图的连通性- Tarjan 求双连通分量.rar
双连拱S形互通隧道减缓隧道压力波的设计构想,王中钢,黄学猛,当高速列车快速驶入隧道时会产生一系列的空气动力学效应。本文从弧形曲面的缓冲效果出发,提出采用双连拱S形互通隧道设计,以增�
行业文档-设计装置-预制、现浇混合式双连梁.zip
行业资料-交通装置-一种汽车用双连万向节.zip
典型双连杆机械臂的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
论文研究- 最优的双连环网.pdf, 含有环结构的网络系统称为环网。环网在通讯网络、局部区域网络系统的设计和运行中广泛地被运用。在超级电子计算机设计中,组合若干平行存储器成循环存储器也常常用到环网,例如在...
POJ3177-Redundant Paths 【Tarjan-边双连通分量-缩点】 解题报告+AC代码+测试数据 http://hi.csdn.net/!s/GPAY6Z 附:我所有的POJ解题报告链接 . http://blog.csdn.net/lyy289065406/article/details/6642573
针对传统“双巷布置”方式易在深部矿井中诱发冲击地压等动力灾害问题,通过...研究结果表明,冲击地压矿井采煤工作面采用双连巷布置,既解决了双巷的难题又实现了双巷的功能,可为冲击地压矿井采煤工作面设计提供参考。
IT通讯电子器件行业单连双连电位器领域分析报告(研究报告).pdf
2021年度单连双连电位器行业人力资源效能分析报告(市场招聘用工).pdf
松下EMC部品片式多层压敏电阻[信号电路用双连型]pdf,用途:静电对策;对象电路:电源、低速 ~ 高速信号电路