双向链表基本知识

一、基本知识

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

}
相关推荐
wuyk55516 小时前
3.链表:用指针串联的动态数据结构
c语言·开发语言·数据结构·链表
郝学胜-神的一滴16 小时前
干货版《算法导论》17:二叉树核心原理、遍历逻辑与高阶实操全解
数据结构·c++·python·算法·计算机·编程
疯狂打码的少年17 小时前
【数据结构】二叉树的性质(五大性质+计算)
数据结构·笔记·算法
wabs66617 小时前
关于图论【A*算法 | 卡码网127.骑士的攻击的思考】
数据结构·算法·图论·卡码网·广搜的改进版
凉茶钱17 小时前
【数据结构】堆的应用
c语言·数据结构
间歇性努力持续性发呆的野生快乐选手19 小时前
栈的性质(进栈,出栈,访问)
数据结构·c++
m0_5474866619 小时前
《数据结构与算法》全套PPT课件2026(中国海洋大学)
数据结构·算法
旖旎夜光19 小时前
LeetCode 904:水果成篮(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
我变成萤火虫21 小时前
河南萌新联赛2026第(三)场:郑州轻工业大学
数据结构·c++·算法·贪心算法·stl·深度优先·哈希算法
白狐_79821 小时前
408数据结构第7章:B树①——基础概念与结构
数据结构·b树