头文件:
#include<iostream.h>
#include"stdlib.h"
typedef int status;
typedef int ElemType;
//链表结点及链表数据表示定义
//双向链表的每个结点需要连接前一个结点和后一个结点,所以需要定义两个指针域,分别指向前一个结点和后一个结点。
typedef struct DualLinkListNode{
ElemType data;
struct DualLinkListNode *prior;
struct DualLinkListNode *next;
}DualLinkListNode,*DualLinkListList;
//以下是双向链表操作函数原型
//初始化操作,初始化时两个指针都指向其自身
status InitDualLinkListList(DualLinkListList &l)
{
cout<<"正在初始化。。。。。。"<<endl;
l=(DualLinkListList)malloc(sizeof(DualLinkListNode));//生成一个DualLinkListNode型的头结点
if(l)
{
l->next=l->prior=NULL; //与双向循环链表有区别
cout<<"初始化成功!"<<endl;
return 1;
}
else
{
cout<<"初始化不成功!"<<endl;
return 0;
}
}
//构造指定元素个数的链表
status CreateDualLinkListList(DualLinkListList &l,int n)
{
DualLinkListList p,q=l;
while(n--) //尾插法
{
p=(DualLinkListList)malloc(sizeof(DualLinkListNode));//构造新结点
cout<<"请输入元素:";
cin>>p->data;
q->next=p; //q等同于l,q的next指向p
p->prior=q; //p的prior指向q
p->next=NULL; //p的next指向NULL
q=p;
}
cout<<"链表已产生!"<<endl;
return 1;
}
//打印链表
void PrintDualLinkListList(DualLinkListList l)
{
DualLinkListList p=l->next;
cout<<"存在链表是:";
while(p)
{
cout<<p->data<<",";
p=p->next;
}
cout<<endl;
}
//链表长度
int DualLinkListListLength(DualLinkListList l)
{
DualLinkListList p=l->next;
int m=1;
while(p->next!=NULL)
{
m++;
p=p->next;
}
return m;
}
//删除链表的第i个元素
status DeleteDualLinkListList(DualLinkListList &l, int i)
{
if( i<1 || i>DualLinkListListLength(l) ) //判断删除位置是否正确
{
cout<<"该链表不存在该位置!删除失败!"<<endl;
return 0;
}
else
{
int k=0;
DualLinkListList p=l->next,q;
while((k<i-1) && (p->next!=NULL)) //循环找到要删除位置的指针
{
p=p->next;
k++;
}
if(p->next!=NULL)
{
q=p;
q->prior->next = p->next;
q->next->prior = p->prior;
free(p);
cout<<"位置为"<<i<<"的元素删除成功!"<<endl;
return 1;
}
else
{
p->prior=NULL;
free(p);
cout<<"sr";
cout<<"位置为"<<i<<"的元素删除成功!"<<endl;
return 1;
}
}
}
//在链表的第i个位置插入元素
status InsertDualLinkListList(DualLinkListList &l, int i)
{
//判断插入位置是否正确
if( i<1 || i>DualLinkListListLength(l)+1 )
{
cout<<"该链表不存在该位置!插入失败!"<<endl;
return 0;
}
else
{
int k=0;
DualLinkListList p=l->next, q;
while(k<i-1 && p->next!=NULL) //循环找到要插入位置的指针
{
p=p->next;
k++;
}
if(!(q=(DualLinkListList)malloc(sizeof(DualLinkListNode))))
{
cout<<"构造结点失败!"<<endl;
return 0;
}
cout<<"构造结点成功,请输入要插入的值:";
cin>>q->data;
q->prior=p->prior;
p->prior->next=q;
q->next=p;
p->prior=q;
cout<<"插入"<<q->data<<"成功!"<<endl;
return 1;
}
}
//取链表中的第i个元素
status GetDualLinkListListElem(DualLinkListList l, int i, ElemType &e)
{
//判断查找位置是否正确
if( i<1 || i>DualLinkListListLength(l) )
{
cout<<"该链表不存在该位置!查找失败!"<<endl;
return 0;
}
else
{
int k=0;
DualLinkListList p=l->next;
while(k<i-1 && p!=NULL)
{
p=p->next;
k++;
}
e=p->data;
cout<<"位置为"<<i<<"的元素为:"<<e<<endl;
}
return 1;
}
源文件:
#include"DualLinkList.h"
void main()
{
DualLinkListList M;
ElemType e;
InitDualLinkListList(M); //初始化构造头结点
CreateDualLinkListList(M,5);//构造链表
PrintDualLinkListList(M); //输出链表
DeleteDualLinkListList(M,4);//删除指定位置的元素
PrintDualLinkListList(M); //输出链表
InsertDualLinkListList(M,2);//指定位置插入元素
PrintDualLinkListList(M); //输出链表
GetDualLinkListListElem(M, 2, e);//取指定位置的元素
}
执行结果: