如何创建不带头节点的双向循环链表
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
*/
一, 大部分情况下,双向循环链表都是带有头节点的,不仅在编程
的时候带来诸多方便,而且应用的场合相对更多,正因为如此,许多
初学者容易忽略对不带头节点双向循环链表的理解与使用。
二,不带头节点的双向循环链表可以应用在哪些方面呢?例如简易相册
的左右滑动,滑到末尾再回到头的情况,起到图片循环浏览的效果,
三,不带头节点的双向循环链表可以实现头与尾的无缝对接,换句话
说就是没头没尾,也可以认为是每个节点都可以是头或尾。
不带头节点的双向循环链表与普通的其他链表一样,有以下歩骤:
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
*/
相关文章推荐
- 【C++】模板实现带头节点的双向循环链表
- 双向循环带头节点链表
- 带头节点带环的双向循环链表
- 不带头节点的双向循环链表的基本操作
- 数据结构示例之带头节点的双向循环链表
- 带头节点的双向循环链表的增删查改
- 双向循环链表的建立,插入,删除(带头节点)
- 数据结构示例之带头节点的双向循环链表
- 双向链表创建、删除某节点
- 带表头节点的双向循环链表编程
- 用模板实现顺序表和带头结点的双向循环链表
- C语言实现双向非循环链表(带头结点尾结点)的节点插入
- josephus问题->不带头节点的循环链表
- 如何用C++实现双向循环链表
- 带表头节点的循环双向链表(头插,尾插,中间插,清除,前向显示,后向显示)
- 带头节点的循环链表及两个循环链表的合并
- (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作
- 判断带头结点的双向循环链表L是否对称相等的算法
- C实现带头节点带环双向链表的操作
- 用头插、尾插、按顺序插入创建一个不带头节点的链表,栈的基本操作