数据结构:双向链表

目录

结构体

创建链表

插入链表

头插法

尾插法

 遍历打印

删除

更新

查找

销毁


结构体

typedef int DataType;

typedef struct node
{
    struct node *pPre;
    DataType data;
    struct node *pNext;
}LinkNode;

创建链表

LinkNode *CreateDouList()
{
    LinkNode *pHead=NULL;
    pHead=malloc(sizeof(LinkNode));
    if(pHead==NULL)
    {
        return NULL;
    }
    pHead->pPre=NULL;
    pHead->pNext=NULL;
    return pHead;
}

插入链表

头插法

int HeadInsertDouList(LinkNode *pHead,DataType Tmpdata)
{
//申请新节点
    LinkNode *pNewNode=NULL;
    pNewNode=malloc(sizeof(LinkNode));
    if(pNewNode==NULL)
    {
        return 0;
    }
//为新节点数据项赋值
    pNewNode->data=Tmpdata;
//新节点pnext指向原来的第一个节点
    pNewNode->pNext=pHead->pNext;
//新节点的pre指向头结点
    pNewNode->pPre=pHead;
//头节点的pnext指向新节点
    pHead->pNext=pNewNode;
//链表不为空时,后一个节点的pre指向新节点
    if(pNewNode->pNext!=NULL)
    {
        pNewNode->pNext->pPre=pNewNode;
    }
    return 0;
}

尾插法

int TailInsertDouList(LinkNode *pHead,DataType Tmpdata)
{
    LinkNode *pNewNode=NULL;
    LinkNode *pTmpNode=NULL;
    pNewNode=malloc(sizeof(LinkNode));
    if(pNewNode==NULL)
    {
        return 0;
    }
    pTmpNode=pHead;
    while(pTmpNode->pNext!=NULL)
    {
        pTmpNode=pTmpNode->pNext;
    }
    pNewNode->data=Tmpdata;
    pNewNode->pNext=NULL;
    pNewNode->pPre=pTmpNode;
    pTmpNode->pNext=pNewNode;
    return 0;

}

 遍历打印

int ShowDouList(LinkNode *pHead)
{
    LinkNode *pTmpNode=NULL;
    pTmpNode=pHead->pNext;
    while(pTmpNode!=NULL)
    {
        printf("%d  ",pTmpNode->data);
        pTmpNode=pTmpNode->pNext;
    }
    return 0;
}

删除

//删除
int DeleteDouList(LinkNode *pHead,DataType Tmpdata)
{
    LinkNode *pTmpNode=NULL;
    LinkNode *pNextNode=NULL;
    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;
        //pTmpNode=pTmpNode->pNext;虽然pTmpNode被释放,但是堆区里面的内容如果没有被重新分配,数据就还存在,此时可以访问到但是属于非法访问
    }
    return 0;
}

更新

int UpdateDouList(LinkNode *pHead,DataType OldData,DataType NewData)
{
    LinkNode *pTmpNode=NULL;
    pTmpNode=pHead->pNext;
    while(pTmpNode!=NULL)
    {
        if(pTmpNode->data==OldData)
        {
            pTmpNode->data=NewData;
        }
        pTmpNode=pTmpNode->pNext;
    }
    return 0;
}

查找

LinkNode *FindDouList(LinkNode *pHead,DataType data)
{
    LinkNode *pTmpNode=NULL;
    pTmpNode=pHead->pNext;
    while(pTmpNode!=NULL)
    {
        if(pTmpNode->data==data)
        {
            return pTmpNode;
        }
        pTmpNode=pTmpNode->pNext;
    }
}

销毁

//销毁
int DestroyDouList(LinkNode **pHead)
{
    LinkNode *pTmpNode=NULL;
    LinkNode *pTmpNext=NULL;
    pTmpNode=*pHead;
    while(pTmpNode!=NULL)
    {
        pTmpNext=pTmpNode->pNext;
        free(pTmpNode);
        pTmpNode=pTmpNext;
    }
    *pHead=NULL;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值