一生一世学坛

 找回密码
 立即注册
搜索
查看: 8101|回复: 0
打印 上一主题 下一主题

c实现双向链表

[复制链接]

334

主题

385

帖子

6816

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6816
跳转到指定楼层
楼主
发表于 2019-6-18 16:59:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
c语言实现双向链表:
头文件:
#include<stdio.h>

typedef struct DlistNode          //双向链表中每一个节点
{                                         
        struct DlistNode *prev;   //节点前项指针
        struct DlistNode *next;   //节点后项指针
        int    data;              //数据
}stDlistNode;

typedef struct Dlisthead          //定义链表总体
{
        int size;                 //链表长度
        stDlistNode *head;        //头指针
        stDlistNode *tail;        //尾部指针
}stDlistHead;


实现文件:
#include<stdio.h>
#include <stdbool.h>
#include "./Dlist.h"



void dlist_init(stDlistHead *dlist)                //链表初始化
{
        dlist->size = 0;
        dlist->head = NULL;
        dlist->tail = NULL;
        return;
}

void dlist_destory(stDlistHead *dlist)                //删除链表
{
        stDlistNode *pNode = NULL;
       
        while(dlist->size > 0)
        {
                pNode = dlist->head;
                dlist->head = dlist->head->next;
                free(pNode);
                dlist->size--;
        }

        memset(dlist,0,sizeof(stDlistHead));

        return;
}

int dlist_insert_head(stDlistHead *dlist,stDlistNode *pNode,int data)                //插入头结点,操作的链表,操作的节点,数据
{
   if(pNode == NULL)                //当只传递一个数据时
   {
            pNode = (stDlistNode *)malloc(sizeof(stDlistNode));                //新建节点,为节点分配空间(malloc()可能需要#include<malloc.h>)
            if (pNode == NULL)
            {
                    return -1;
            }
    }

    pNode->data = data;                       
        pNode->prev = NULL;
        pNode->next = NULL;

        if (dlist->size == 0)                //如果链表长度为0,即链表当前无节点,
        {
                dlist->head = pNode;
                dlist->tail = pNode;
        }
        else                           //如果链表已有节点,则令新插入节点为头节点
        {
                pNode->next = dlist->head;
                dlist->head->prev = pNode;
                dlist->head = pNode;                       
        }

        dlist->size++;                //每成功调用一次,链表长度+1
        return 0;
}

stDlistNode * dlist_remove_tail(stDlistHead *dlist)                //删除尾部节点,并返回删除节点
{
        stDlistNode *pNode = NULL;

        if(dlist->size == 0)
        {
                return NULL;
        }

    pNode = dlist->tail;
        if(dlist->size > 1)
        {
                dlist->tail = dlist->tail->prev;
                dlist->tail->next = NULL;
        }
        else
        {
                dlist->head = NULL;
                dlist->tail = NULL;
        }
        dlist->size--;
        return pNode;
}

void dlist_remove_node(stDlistHead * dlist,stDlistNode *pNode)                 //删除指定节点
{
        if ((dlist == NULL)||(pNode == NULL))
        {
                return;
        }

        if (dlist->head == pNode)
        {
                dlist->head = dlist->head->next;
        }
        else if (dlist->tail == pNode)
        {
                dlist->tail = pNode->prev;

                dlist->tail->next = NULL;
        }
        else
        {
                pNode->prev->next = pNode->next;
                pNode->next->prev = pNode->prev;
        }
        dlist->size--;
        pNode->prev = NULL;
        pNode->next = NULL;
       
        if (dlist->size == 0)
        {
                memset(dlist,0,sizeof(stDlistHead));                 //将dlist占用内存块的所有值置为0,也就是清空head,tail指针内容
        }

        return;
}
stDlistNode * dlist_search(stDlistHead * dlist,int data)                 //根据值搜索节点,并返回
{
        stDlistNode *pNode = dlist->head;
        while(pNode != NULL)
        {
                if (pNode->data == data)
                {
                        return pNode;
                }
                pNode = pNode->next;

    }
        return NULL;
}

void dlist_dump(stDlistHead *dlist)                //显示链表中的数据
{
        int no = 0;
        stDlistNode *pNode = dlist->head;
        while(pNode != NULL)               
        {
                printf("\r\n [%d] = %d",no++,pNode->data);
                pNode = pNode->next;                //将pNode的下一个节点赋值给pNode,推进循环
        }

        return;
}


void Lru_dlist(stDlistHead *dlist,int data)                 //LRU(最近最少使用)缓存淘汰算法
{
        stDlistNode *pNode = NULL;

        pNode = dlist_search(dlist,data);               
        if (pNode != NULL)                                 //如果在链表中找到这个值,则删除储存这个值的节点,之后吧这个节点放在头部
        {
                dlist_remove_node(dlist,pNode);
        }
        else if(dlist->size >= 4)                        //没在链表中找到,且链表长度大于4,则从链表中删除尾部节点,将新数据放在头部
        {
                pNode = dlist_remove_tail(dlist);

        }
       
        dlist_insert_head(dlist ,pNode,data);

        return;
}


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|分享学习  

GMT+8, 2024-5-2 12:53 , Processed in 0.043306 second(s), 7 queries , File On.

声明:本站严禁任何人以任何形式发表违法言论!

本站内容由网友原创或转载,如果侵犯了您的合法权益,请及时联系处理!© 2017 zamxqun@163.com

皖公网安备 34010402700634号

皖ICP备17017002号-1

快速回复 返回顶部 返回列表