定义一个双向链表结构:
typedef struct DulNode{
// *prior:前一个元素的地址
// *next:后一个元素的地址
struct DulNode *prior;
Element data;
struct DulNode *next;
}DulNode,*DuLinkList;
初始化一个双向链表 :
DuLinkList doubleLinkedListInit(){
DuLinkList L;
L = (DuLinkList)malloc(sizeof(DulNode));
L->next = NULL;
L->prior = NULL;
}
创建一个双向链表:
//尾插法
void duLinkListCreateT(DuLinkList l,int size){
DuLinkList t;
t = l;
for(int i = 1; i <= size; i++){
DuLinkList p;
p = (DuLinkList)malloc(sizeof(DulNode));
p->data = i;
t->next = p;
p->prior = t;
t = p;
}
t->next = NULL;
}
// 头插法
void duLinkListCreateH(DuLinkList l,int size){
for(int i = 1; i <= size; i++){
DuLinkList p;
p = (DuLinkList)malloc(sizeof(DulNode));
p->data = i;
p->prior = l;
p->next = l->next;
if(l->next){
l->next->prior = p;
}
l->next = p;
}
}
打印输出:
void printDuLinkList(DuLinkList l){
DuLinkList t;
t = l;
printf("正向遍历结果:[");
while(t->next){
t = t->next;
printf("%d",t->data);
if(t->next){
printf(",");
}
}
printf("]\n");
printf("反向遍历结果:[");
while(t->prior&&t!=l){
printf("%d",t->data);
t = t->prior;
if(t!=l){
printf(",");
}
}
printf("]\n");
}
指定位置插入
Status duLinkListInsert(DuLinkList l,int index,Element v){
DuLinkList p,e;
p = l->next;
int i = 1;
// 移到p指针到要插入位置的前一个位置
while(p&&inext;
++i;
}
if(!p||i>index){
// 第index个节点不存在
return ERROR;
}
e = (DuLinkList) malloc(sizeof(DulNode));
// 设置插入节点的数据为传递过来的参数值
e->data = v;
// 将要插入节点后继为p指针的next,前驱就是p指针
e->next = p->next;
e->prior = p;
// 将原本是index位置节点的前驱指向要插入的元素
p->next->prior = e;
// 将p的next指向要插入的元素。
p->next = e;
return OK;
}
删除指定位置的元素:
void duLinkListRemove(DuLinkList l,int index,Element *e){
DuLinkList p,temp;
p = l->next;
int i = 1;
// 移到p指针到要删除位置的位置
while(p&&i<=index){
p = p->next;
++i;
}
if(!p||i>index){
// 第index个节点不存在
exit(0);
}
p->next->prior = p->prior;
p->prior->next = p->next;
*e = p->data;
// 释放所在的内存空间
free(p);
}
测试结果: