双向链表
双向循环链表:对称性
#include <iostream>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXSIZE 100
using namespace std;
typedef int Status;//返回值类型
typedef char ElemType;//数据类型
using namespace std;
typedef struct Lnode{
ElemType data;
Lnode* next;
Lnode* prior;
}Lnode,*DuLinkList;
void InitDuL(DuLinkList &L){
L=new Lnode;
L->prior=L;
L->next=L->prior;
}
//双向链表查询第i个位置的元素返回地址,时间复杂度为O(n)
Lnode* GetElemP_DuL(DuLinkList L,int i){
Lnode* p;
p=L->next;
int index=1;
while(p!=L&&index<i){
p=p->next;
index++;
}
if((p==L&&index!=i)||index>i){//(p==L&&index!=i)是为了可以让在最后一个节点后增加节点可以正常操作,在删除时注意判断是否为头结点
return nullptr;
}
return p;
}
//双向链表的插入,用到GetElemP_DuL,时间复杂度也为O(n)
Status ListInsert_DuL(DuLinkList &L,int i,ElemType e){
Lnode* p;
if(!(p=GetElemP_DuL(L,i))) return ERROR;
Lnode* s=new Lnode;
s->data=e;
s->prior=p->prior;
p->prior->next=s;
s->next=p;
p->prior=s;
return OK;
}
//双向链表的删除,这里也是O(n)
Status ListDelete_DuL(DuLinkList &L,int i,ElemType &e){
Lnode* p;
if(!(p=(L,i))||p==L) return ERROR;//第i个位置找不到,即非法
//p==L删除时判断是否为头结点
printf("\n得到的节点为:%c\n",p->data);
printf("f的前驱为%c\n",p->prior->data);
printf("f的后继为%c\n",p->next->data);
printf("a的前驱为%c\n",p->next->prior->data);
printf("head的后继为%c\n",p->prior->next->data);
e=p->data;
p->prior->next=p->next;
p->next->prior=p->prior;
delete p;
return OK;
}
//双向链表的初始化
void createDuL(DuLinkList &L,int i){
InitDuL(L);
for(int j=0;j<i;j++){
Lnode* s=new Lnode;
cin>>s->data;
s->prior=L->prior;
L->prior->next=s;
s->next=L;
L->prior=s;
}
}
//遍历链表
void select(DuLinkList L){
Lnode* p;
p=L->next;
while(p!=L){
printf("链表数据:%c",p->data);
p=p->next;
}
}
int main()
{
DuLinkList L;
createDuL(L,5);
select(L);
Lnode* p=GetElemP_DuL(L,2);
printf("\np->data:%c",p->data);
ListInsert_DuL(L,1,'f');
printf("\n");
select(L);
ElemType r;
printf("%d\n",ListDelete_DuL(L,1,r));
printf("r:%c\n",r);
select(L);
return 0;
}