当前位置: 首页 > article >正文

双向链表的复杂操作、内核链表、栈

双向链表的复杂操作

一、插入

1、头插法

int HeadInsertDouList(LinkNode *pHead, DataType TmpData)
{
    LinkNode *pNewNode = NULL;

    pNewNode = malloc(sizeof(LinkNode));
    if (NULL == pNewNode)
    {
        return -1;
    }

    pNewNode->Data = TmpData;
    pNewNode->pNext = pHead->pNext;
    pNewNode->pPre = pHead;
    pHead->pNext = pNewNode;
    if (pNewNode->pNext != NULL)
    {
        pNewNode->pNext->pPre = pNewNode;
    }

    return 0;
}

2、尾插法

int TailInsertDouList(LinkNode *pHead, DataType TmpData)
{
    LinkNode *pLastNode = NULL;
    LinkNode *pTmpNode = NULL;

    pLastNode = pHead;
    while (pLastNode->pNext != NULL)
    {
        pLastNode = pLastNode->pNext;
    }

    pTmpNode = malloc(sizeof(LinkNode));
    if (NULL == pTmpNode)
    {
        return -1;
    }

    pTmpNode->Data = TmpData;
    pTmpNode->pNext = NULL;
    pTmpNode->pPre = pLastNode;
    pLastNode->pNext = pTmpNode;

    return 0;
}

二、删除

int DeleteDouList(LinkNode *pHead, DataType TmpData)
{
    LinkNode *pTmpNode = NULL;
    LinkNode *pNextNode = NULL;
    int cnt = 0;

    pTmpNode = pHead->pNext;
    while (pTmpNode != NULL)
    {
        if (pTmpNode->Data == TmpData)
        {
            pNextNode = pTmpNode->pNext;
            pTmpNode->pPre->pNext = pTmpNode->pNext;
            if (pTmpNode->pNext != NULL)
            {
                pTmpNode->pNext->pPre = pTmpNode->pPre;
            }      
            free(pTmpNode);
            pTmpNode = pNextNode;
            cnt++;
        }
        else 
        {
            pTmpNode = pTmpNode->pNext;
        }
    }

    return cnt;
}

其余的一些操作,比如正向遍历,反向遍历,查找,替换,销毁的代码与单向链表没有什么区别 

内核链表

一、插入

1、头插法

list_add (struct list_head *new, struct list_head *head)
{
	new->prev = head;
	new->next = head->next;

	new->prev->next = new;
	new->next->prev = new;
}

2、尾插法

list_add_tail (struct list_head *new, struct list_head *head)
{
	new->next = head;
	new->prev = head->prev;

	new->prev->next = new;
	new->next->prev = new;
}

二、删除 

list_del (struct list_head *old)
{
	old->prev->next = old->next;
	old->next->prev = old->prev;

	old->next = (void *)0xbabebabe;
	old->prev = (void *)0xcafecafe;
}

三、遍历 

#define list_for_each(pos, head)                                        \
	for (pos = (head)->next; pos != (head); pos = pos->next)

栈 

一、原则

FILO:先进后出,后进先出 


二、概念

1、栈顶:允许入栈出栈的一端称为栈顶
2、栈底:不允许入栈和出栈的一端称为栈底
3、入栈(压栈):将数据元素放入栈顶
4、出栈(弹栈):将数据元素从栈顶位置取出

三、分类

1、空增栈
2、空减栈
3、满增栈
4、满减栈

栈的基本操作也都可以通过内核链表实现


http://www.kler.cn/a/282030.html

相关文章:

  • Liunx-Ubuntu22.04.1系统下配置Anaconda+pycharm+pytorch-gpu环境配置
  • RabbitMQ教程:发布/订阅模式(Publish/Subscribe)(三)
  • DataStream编程模型之数据源、数据转换、数据输出
  • 蜀道山CTF<最高的山最长的河>出题记录
  • HBase 开发:使用Java操作HBase
  • 自制C++游戏头文件:C++自己的游戏头文件!!!(后续会更新)
  • 操作系统:哪些函数属于系统调用?
  • Java新版主要特性|2024年最后一个版本即将到来
  • 网络编程Day9_IO多路复用 20240821
  • ThingsKit物联网平台与AIoTedge边缘计算平台的融合创新
  • ESXi服务器无法安装Windows11:“不符合此版本的Windows所需最低系统要求“
  • Python相关系数导图
  • 驱动开发系列12 - Linux Graphics 图形驱动概述(一)
  • 素数之和(c语言)
  • 如何使用ssm实现酒店预约及管理系统的设计与实现+vue
  • 基于SSM+小程序的乡村游小程序登录管理系统(旅游3)(源码+sql脚本+视频导入教程+文档)
  • 喝白酒不伤身的5大方法
  • HCIA--IP路由基础
  • Efficient LoFTR论文阅读(特征匹配)
  • Java 输入与输出之 NIO【非阻塞式IO】【NIO网络编程】探索之【二】
  • GPT-4.0 新手使用教程(保姆级入门)
  • Springboot-基于Axis2的WebService,发送短信并加密短信内容,使用BouncyCastle作为加密库
  • 基于计算机视觉的图书推荐应用【AI编程实录】
  • sqli-labs靶场通关攻略 46-50
  • 【C#】【EXCEL】Bumblebee/Classes/ExColumn.cs
  • 代码随想录(day8)—环形链表