双向链表的增删改查

//
// Created by Zhongqi.Shao on 2016/12/13.
//

#ifndef DOUBLELINK_DOUBLELINK_H
#define DOUBLELINK_DOUBLELINK_H

typedef int DataType;

typedef struct LinkNode {
    DataType data;
    struct LinkNode *next;
    struct LinkNode *pre;
} Node;

typedef struct DoubleLink {
    Node *pHead;
    Node *pTail;
} DLink;


extern void addDataBack(DLink *link, DataType data);

extern void addDataHead(DLink *link, DataType data);

extern void deleteData(DLink *link, DataType data);

extern void showLinkBack(DLink *link);

extern void showLinkHead(DLink *link);


#endif //DOUBLELINK_DOUBLELINK_H
 
 
 
//
// Created by Zhongqi.Shao on 2016/12/13.
//
#include"DoubleLink.h"
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>


extern void addDataBack(DLink *link, DataType data) {
    if (link == NULL) {
        return;
    }
    Node *newNode = (Node *) malloc(sizeof(Node));
    newNode->data = data;
    newNode->pre = NULL;
    newNode->next = NULL;
    if (link->pHead == NULL || link->pTail == NULL) {
        link->pHead = newNode;
        link->pTail = newNode;
    } else {
        link->pTail->next = newNode;
        newNode->pre = link->pTail;
        link->pTail = newNode;
    }
}

extern void addDataHead(DLink *link, DataType data) {
    if (link == NULL) {
        return;
    }
    Node *newNode = (Node *) malloc(sizeof(Node));
    newNode->data = data;
    newNode->pre = NULL;
    newNode->next = NULL;
    if (link->pHead == NULL || link->pTail == NULL) {
        link->pTail = newNode;
        link->pHead = newNode;
    } else {
        newNode->next = link->pHead;
        link->pHead->pre = newNode;
        link->pHead = newNode;
    }
}

extern void showLinkBack(DLink *link) {
    if (link == NULL) {
        return;
    }
    Node *tmp = link->pHead;
    while (tmp != NULL) {
        printf("Node Data = %d\n", tmp->data);
        tmp = tmp->next;
    }

}

extern void showLinkHead(DLink *link) {
    if (link == NULL) {
        return;
    }
    Node *tmp = link->pTail;
    while (tmp != NULL) {
        printf("Node Data = %d\n", tmp->data);
        tmp = tmp->pre;
    }
}


extern void deleteData(DLink *link, DataType data) {
    if (link == NULL || link->pTail == NULL || link->pHead == NULL) {
        return;
    }
    Node *tmp = link->pHead;
    while (tmp != NULL) {
        if (tmp->data == data) {
            break;
        }
        tmp = tmp->next;
    }

    if (tmp == link->pHead) {
        link->pHead->next->pre = NULL;
        link->pHead = link->pHead->next;
        free(tmp);

    } else if (tmp == link->pTail) {
        link->pTail->pre->next = NULL;
        link->pTail = link->pTail->pre;
        free(tmp);

    } else {
        tmp->pre->next = tmp->next;
        tmp->next->pre = tmp->pre;
        free(tmp);
    }

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值