双向循环链表操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了双向循环链表操作相关的知识,希望对你有一定的参考价值。

双链表:
1 2 3 4 5 6 7 8 9 10 11 12

1 3 5 7 9 11 12 10 8 6 4 2
1。设计节点
typedef int datatyped
typeddef struct node
{
typedata data;
struct node * next;
struct node *prev;

}listnode ,*linklist;


2.初始化空双向循环链表
linklist init_list()
{
linklist l=malloc(sizeof(listnode))
if(l!=NULL)
{

l->next=l;
l->prev=l;
}
return l;

}

3.插入
bool insert_prev(linklist new,linklist L)
{
//新节点前后关系
new->n=L
new->p=L-p;


//新节点前一节点的后面关系
L->p->n=new;
//新节点后一节点的前面关系
L->p=new;

return true;

}

4.显示
show()
{

 

}
remove_node(linklist pl)
{
pl->p->n=pl->n;
pl->n->p=pl->p;
pl->p=pl->n=NULL;


}
move_p(linklist pl,linklist L)
{
remove_node(pl);
insert_prev(pl,L);

}

5.
ran(linklist L)
{
linklist pl=L->p,q;

int i=0;
while(pl!=L)
{
if((pl->data)%2==0 && i==1)
{
//删除和插入操作
move_p(pl,L);
pl=q;
}
else
q=pl;

pl=pl->p;

i=1;
}


}


int main()
{
linlist L=init_list();

for(i=1;i<=n;i++)
{
linklist new =malloc();
new->data=i;

insert_prev(new,L);

}


ran(L)

show(L)

 

}

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int datatype;
typedef struct node
{
datatype data;
struct node *next;
struct node *prve;
}listnode,*linklist;

linklist init_list()
{
linklist L = malloc(sizeof(listnode));
if(L!=NULL)
{
L->next = L;
L->prve = L;
}
return L;
}

bool insert_prve(linklist new,linklist L)//在L的前驱插入节点
{
new->next = L;
new->prve = L->prve;
L->prve->next = new;
L->prve = new;
return true;

}
/* while(q->prve ! = q)
{

}
*/
bool cir_insert(linklist L)//显示奇偶显示1 3 5 7 9 10 8 6 4 2
{
linklist p=L->prve,q;
// s = L->next;
while(p != L)//注意循环条件
{

if(p->data%2==0)
{ q=p->prve;//记录p的前驱,以便p指针向前移动
p->prve->next = p->next;
p->next->prve = p->prve;
p->prve = L->prve;
L->prve->next = p;
p->next = L;
L->prve = p;
p=q;//之前记录的指针。

}
p=p->prve;

}
return true;
}


void show(linklist L)//打印循环链表数据
{ linklist p =L;
while(p->next!=L)
{ p = p->next;
printf("%d\t",p->data);
}
printf("\n");

}
int main()
{
linklist L;
L = init_list();
int i;
for(i=1;i<=10;i++)
{
linklist new = malloc(sizeof(listnode));
new->data = i;
insert_prve(new,L);
}
cir_insert(L);
show(L);
return 0;

}

以上是关于双向循环链表操作的主要内容,如果未能解决你的问题,请参考以下文章

《链表》之带头双向循环链表

C语言实现双向非循环链表的清空

循环链表和双向链表

循环链表和双向链表

带头结点的双向循环链表及相应的操作

带头双向循环链表 代码实现 review