双向链表基础

类型定义

#ifndef __DOUBLE_LINKLIST_
#define __DOUBLE_LINKLIST_

#include <stdbool.h>

typedef struct _linklistNode
{
    struct _linklistNode *prev,*next;
    void *dataPtr;
}linklistNode ;
typedef struct
{
    struct _linklistNode *head;
    int nodenum;
}doubleLinkList;

void initLinkList(doubleLinkList *linklist);
bool addLinkListNode(doubleLinkList *linklist ,void *nodeData);
bool delLinkListNode(doubleLinkList *linklist ,void *nodeData);


void t1();

#endif // __DOUBLE_LINKLIST_

实现

#include <head.h>
#include "./doubleSideLinklist.h"
void initLinkList(doubleLinkList *linklist)
{
   linklist->head=NULL;
   linklist->nodenum =0;
}
bool addLinkListNode(doubleLinkList *linklist ,void *nodeData)
{
    linklistNode *node =NULL;
    linklistNode *head = linklist->head;
    node  = (linklistNode * )malloc(sizeof(linklistNode));
    if(node ==NULL){
        perror("malloc error");
        return false;
    }
    node ->dataPtr = nodeData;
    if( !(linklist->head ) ){
        node->next =node;
        node->prev  =node;
        linklist->head = node;
        linklist->nodenum=1;
    }
    else{
        node->next = head;
        node->prev = head->prev;
        (head->prev)->next = node;
        head->prev  = node;
        linklist->head = node;
         linklist->nodenum++;
    }
    printf("head:%#X,node node addr:%#X, prev %#X,next:%#X\n",
            (unsigned int )linklist->head,(unsigned int)node,(unsigned int )node->prev,(unsigned int )node->next);
    return true;

}
bool delLinkListNode(doubleLinkList *linklist ,void *nodeData)
{
    if((!linklist ) ){
        return false;
    }
    else{
        if(linklist->nodenum ==1){
            if(linklist->head->dataPtr == nodeData){
                free(linklist->head);
                initLinkList(linklist);
            }
        }
        else{
            linklistNode * start = linklist->head;
            int x= linklist->nodenum;
            while(x--){
                if(start->dataPtr == nodeData){
                    (start->next)->prev = start->prev;
                    start->prev->next = start->next;
                    linklist->nodenum--;
                    free(start);
                    break;
                }
                start = start->next;
            }
        }
    }
    return true;
}
void print(doubleLinkList linklist )
{
    linklistNode * node = linklist.head;
    int x= linklist.nodenum;
    for(int i=0;i<x;i++)
    {
        printf("node [%d] addr:%#X, prev %#X,next:%#X\n",i,
            (unsigned int)node,(unsigned int )node->prev,(unsigned int )node->next);
        node = node->next;
    }
}
//测试程序
void t1()
{
    doubleLinkList  l;
    initLinkList(&l);
    addLinkListNode(&l,1);
    addLinkListNode(&l,2);
    addLinkListNode(&l,3);
    print(l);
    delLinkListNode(&l,2);
    delLinkListNode(&l,1);
    print(l);
    delLinkListNode(&l,0);
    print(l);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值