您的位置:首页 > 编程语言

如何创建不带头节点的双向循环链表

2017-07-28 14:27 295 查看
论如何创建不带头节点的双向循环链表

一, 大部分情况下,双向循环链表都是带有头节点的,不仅在编程

的时候带来诸多方便,而且应用的场合相对更多,正因为如此,许多

初学者容易忽略对不带头节点双向循环链表的理解与使用。

二,不带头节点的双向循环链表可以应用在哪些方面呢?例如简易相册

的左右滑动,滑到末尾再回到头的情况,起到图片循环浏览的效果,

三,不带头节点的双向循环链表可以实现头与尾的无缝对接,换句话

说就是没头没尾,也可以认为是每个节点都可以是头或尾。

不带头节点的双向循环链表与普通的其他链表一样,有以下歩骤:

1.链表初始化

2.新建节点

3.插入节点

4.删除节点(为了更好的保护内存,删除后一般要释放)

5.像查找节点,移动节点等等其他的一些操作和其他链表差不多,

需要注意的是操作节点的指针的是不要吓指而丢失了节点和出现

找不到的情况。*/

/**********************以下为一点示例******************/

#include<stdio.h>

#include<stdlib.h>

//链表必备结构体

typedef struct node

{
int        data;
struct node *prev;
struct node *next;

}listnode, *linklist;

//链表初始化,因不带头节点,直接返回空

linklist init_list()

{

return NULL;

}

//新建节点

linklist new_node(int data)

{
linklist new = malloc(sizeof(listnode));
if(new != NULL)
{
new->data     = data;
new->prev = new->next = new;   //尽量指向自己
}
return new;

}

//添加节点,默认加在最后面,也就是第一个的前面

//添加前进行一个判断,判断链表为空吗,空的话添

//加的new为第一个节点,这是形成不带头节点最最关

//键的地方

linklist add_node(linklist mylist,linklist new)

{

if(mylist == NULL)
{
printf("creat the first node\n");
return new;
}

else
{
new->prev          = mylist->prev;
new->next          = mylist;
new->prev->next    = new;
mylist->prev       = new;
printf("add newnode ....%d....\n",new->data);
return mylist;
}

}

//显示链表

void show_list(linklist mylist)

{
printf("show the linklist!!\n");
linklist tmp = mylist->next;
int flag = 0;
while(tmp != mylist)
{
       printf("%s", "<===> ");
printf("%d", tmp->data);
printf("\t");
tmp = tmp->next;
flag = 1;
}

printf("\n");

}

//删除节点

/*void remove_node(linklist mylist)

{
if(mylist == NULL)

return;

mylist->prev->next = mylist->next;
mylist->next->prev = mylist->prev;
mylist->prev       = NULL;
mylist->next       = NULL;
free(mylist);  //释放流浪的节点,保护内存

}*/

//那现在我们来操作链表一下

int main(int argc, char **argv)

{
int i;
linklist mylist = init_list();
for(i=0; i<10; i++)
{
linklist new = new_node(i);

if(new != NULL)
{
mylist = add_node(mylist, new);
}
}
show_list(mylist);
return 0;

}

//运行结果,这里仅仅是创建显示,是不是感觉很perfect

/*creat the first node

add newnode ....1....

add newnode ....2....

add newnode ....3....

add newnode ....4....

add newnode ....5....

add newnode ....6....

add newnode ....7....

add newnode ....8....

add newnode ....9....

show the linklist!!

<===> 1 <===> 2
<===> 3 <===> 4
<===> 5 <===> 6
<===> 7 <===> 8
<===> 9

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息