双向链表基本知识

一、基本知识

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

}
相关推荐
Fanxt_Ja3 天前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
今后1233 天前
【数据结构】二叉树的概念
数据结构·二叉树
散1123 天前
01数据结构-01背包问题
数据结构
消失的旧时光-19433 天前
Kotlinx.serialization 使用讲解
android·数据结构·android jetpack
Gu_shiwww3 天前
数据结构8——双向链表
c语言·数据结构·python·链表·小白初步
苏小瀚3 天前
[数据结构] 排序
数据结构
_不会dp不改名_3 天前
leetcode_21 合并两个有序链表
算法·leetcode·链表
睡不醒的kun3 天前
leetcode算法刷题的第三十四天
数据结构·c++·算法·leetcode·职场和发展·贪心算法·动态规划
吃着火锅x唱着歌3 天前
LeetCode 978.最长湍流子数组
数据结构·算法·leetcode
Whisper_long3 天前
【数据结构】深入理解堆:概念、应用与实现
数据结构