双向链表基本知识

一、基本知识

1、两个指针,可以通过任意一个结点找到其前一个结点和后一个结点

二、基本操作

2.1、创建一个双向链表

cs 复制代码
Dlink_t *Create_doublelink()
{
    Dlink_t *pdoulink = malloc(sizeof(Dlink_t));
    if(pdoulink == NULL)
    {
        return NULL;
    }
    pdoulink->phead = NULL;
    pdoulink->clen = 0;
    pthread_mutex_init(&(pdoulink->mutex),NULL);
    return pdoulink;
}

2.2、头插

cs 复制代码
nt push_doublelink(Dlink_t *dblink,Stu_t data)
{
    Dlink_node_t *dbnode = malloc(sizeof(Dlink_node_t));
    if(dbnode == NULL)
    {
        perror("fail dbnode");
        return -1;
    }
    dbnode->data = data;
    dbnode->pperv = NULL;
    dbnode->pnext = NULL;
    if(is_empty_doublelink(dblink))
    {
        dblink->phead = dbnode;
    }
    else
    {
        dbnode->pnext = dblink->phead;
        dblink->phead->pperv = dbnode;
        dblink->phead = dbnode;
    }
    dblink->clen++;
    return 0;
}

2.3、尾插

cs 复制代码
int push_tail_doublelink(Dlink_t *dblink,Stu_t data)
{
    Dlink_node_t *dbnode = malloc(sizeof(Dlink_node_t));
    if(dbnode == NULL)
    {
        perror("fail dbnode");
        return -1;
    }
    dbnode->data = data;
    dbnode->pperv = NULL;
    dbnode->pnext = NULL;
    Dlink_node_t *dnode = dblink->phead;
    if(is_empty_doublelink(dblink))
    {
        dblink->phead = dbnode;
    }
    else
    {
        while(dnode->pnext != NULL)
        {
            dnode = dnode->pnext;
        }
        dnode->pnext = dbnode;
        dbnode->pperv = dnode;

    }
}

2.4、头删

cs 复制代码
int delete_head_doublelink(Dlink_t *dblink)
{
    if(is_empty_doublelink(dblink))
    {
        return -1;
    }
    Dlink_node_t *dbnode = dblink->phead;
    dblink->phead = dbnode->pnext;
    if(dbnode->pnext != NULL)
    {
        dbnode->pnext->pperv = NULL;
    }
    free(dbnode);
    dblink->clen--;
    return 0;
}

2.5、尾删

cs 复制代码
int delete_tail_doublelink(Dlink_t *dblink)
{
    if(is_empty_doublelink(dblink))
    {
        return -1;
    }
    Dlink_node_t *dnode = dblink->phead;
    while(dnode->pnext != NULL)
    {
        dnode = dnode->pnext;
    }
    if(donde->pperv != NULL)
    {
        dnode->pperv->pnext = NULL;
    }
    free(dnode);
    dblink->clen--;  
    return 0;
}

2.6、查询

cs 复制代码
Dlink_node_t *select_doublelink(Dlink_t *dblink,Stu_t data)
{
    if(is_empty_doublelink(dblink))
    {
        return NULL;
    }
    Dlink_node_t *dnode = dblink->phead;
    while(!strcmp(dnode->data.name,data.name))
    {
        dnode =dnode->pnext;
    }
    return dnode;
}

2.7、修改

cs 复制代码
}
Dlink_node_t *alter_doublelink(Dlink_t *dblink,Stu_t data,char *p)
{
    Dlink_node_t *q = select_doublelink(dblink,data);
    strcpy(q->data.name,p);
    return q;
}

2.8、销毁

cs 复制代码
int destory_doublelink(Dlink_t *dblink)
{
    if(is_empty_doublelink(dblink))
    {
        return -1;
    }
    Dlink_node_t *pnode = NULL;
    Dlink_node_t *p = NULL;
    while(dblink->phead != NULL)
    {
        pnode = dblink->phead;
        dblink->phead = pnode->pnext;
       cc
    }

    free(dblink);
    return 0;
}

注意

在销毁的时候,要需注意在此用的是头删,我们需要考虑,头删的结点,的下一个结点是否存在,也就是说特列是只有一个结点,如果不考虑会造成指针越界

2.9、遍历

cs 复制代码
void doulink_for_each(DLink_t *pdoulink, int dir)
{
	if (is_empty_doulink(pdoulink))
		return;
	
	DLink_Node_t *p = pdoulink->phead;
	if (dir)
	{
		while (p != NULL)
		{
			printf("%d %s %d\n", p->data.id, p->data.name, p->data.score);
			p = p->pnext;
		}
	}
	else
	{
		while (p->pnext != NULL)
		{
			p = p->pnext;
		}
		while (p != NULL)
		{
			printf("%d %s %d\n", p->data.id, p->data.name, p->data.score);
			p = p->ppre;
		}
	}
	printf("\n");

}
相关推荐
星释1 小时前
Rust 练习册 67:自定义集合与数据结构实现
数据结构·算法·rust
2301_807997383 小时前
代码随想录-day47
数据结构·c++·算法·leetcode
别动哪条鱼3 小时前
FFmpeg 核心数据结构关系图
数据结构·ffmpeg
小龙报3 小时前
《算法通关指南数据结构和算法篇(2)--- 链表专题》
c语言·数据结构·c++·算法·链表·学习方法·visual studio
万物挽挽3 小时前
数据结构概述
数据结构
wangwangmoon_light4 小时前
1.10 数据结构之图
数据结构
星轨初途5 小时前
数据结构排序算法详解(2)——选择排序(附动图)
c语言·数据结构·经验分享·笔记·b树·算法·排序算法
Chance_to_win7 小时前
数据结构之排序
数据结构
小年糕是糕手7 小时前
【C++】类和对象(二) -- 构造函数、析构函数
java·c语言·开发语言·数据结构·c++·算法·leetcode
kupeThinkPoem8 小时前
跳表有哪些算法?
数据结构·算法