双向链表基本知识

一、基本知识

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

}
相关推荐
YGGP1 小时前
吃透 Golang 基础:数据结构之 Map
开发语言·数据结构·golang
weixin_419658311 小时前
数据结构之栈
数据结构
图先1 小时前
数据结构第一章
数据结构
草莓熊Lotso3 小时前
【数据结构初阶】--算法复杂度的深度解析
c语言·开发语言·数据结构·经验分享·笔记·其他·算法
Andrew_Xzw5 小时前
数据结构与算法(快速基础C++版)
开发语言·数据结构·c++·python·深度学习·算法
超的小宝贝6 小时前
数据结构算法(C语言)
c语言·数据结构·算法
凤年徐8 小时前
【数据结构初阶】单链表
c语言·开发语言·数据结构·c++·经验分享·笔记·链表
闪电麦坤9513 小时前
数据结构:递归的种类(Types of Recursion)
数据结构·算法
小熊猫写算法er13 小时前
终极数据结构详解:从理论到实践
数据结构
-qOVOp-14 小时前
408第一季 - 数据结构 - 栈与队列的应用
数据结构