双向链表基本知识

一、基本知识

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");

}
相关推荐
液态不合群17 分钟前
查找算法详解
java·数据结构·算法
LYFlied38 分钟前
【每日算法】LeetCode 105. 从前序与中序遍历序列构造二叉树
数据结构·算法·leetcode·面试·职场和发展
重生之我是Java开发战士40 分钟前
【数据结构】Java对象的比较
java·jvm·数据结构
DanyHope44 分钟前
LeetCode 206. 反转链表:迭代 + 递归双解法全解析
算法·leetcode·链表·递归·迭代
历程里程碑1 小时前
C++ 16:C++11新特化
c语言·开发语言·数据结构·c++·经验分享
_dindong1 小时前
算法杂谈:回溯路线
数据结构·算法·动态规划·bfs·宽度优先
DanyHope1 小时前
LeetCode 283. 移动零:双指针双解法(原地交换 + 覆盖补零)全解析
数据结构·算法·leetcode
山土成旧客1 小时前
【Python学习打卡-Day24】从不可变元组到漫游文件系统:掌握数据结构与OS模块
数据结构·python·学习
LYFlied2 小时前
【每日算法】LeetCode 114. 二叉树展开为链表:从树结构到线性结构的优雅转换
数据结构·算法·leetcode·链表·面试·职场和发展
cpp_25012 小时前
P8723 [蓝桥杯 2020 省 AB3] 乘法表
数据结构·c++·算法·蓝桥杯·题解·洛谷