双链表实现

在实现双端链表的时候,由于图简单,没加哨兵。导致删除节点的时候出现free首节点无法删除。

原因是:引用 这篇博客 http://blog.csdn.net/llhyy17/article/details/5375298

     void free(void *ptr) 
    { 
            struct mem_control_block *free
            free = ptr - sizeof(struct mem_control_block); 
            free->is_available = 1; 
            return; 
    }

需要将头节点往前移一个数据类型占用的内存大小。然后将这个地方的位置标记为可以使用的。这个时候就出现了内存访问非法了。

    #include 
  
  
   
   
#include 
   
   
    
    
#include 
    
    
     
     
#define max_link_length 10
using namespace std;
///定义一个节点
typedef struct Node {
    struct Node *pre;
    struct Node *next;
    int value;
} Node,*DulLink;

///init a link
DulLink init(Node *dulLink) {
    if(dulLink == NULL) {
        dulLink = (Node*) malloc(sizeof(Node));
        dulLink->pre = NULL;
    }
    printf("%d,",dulLink->value);
    Node* list = dulLink;
    for(int i =1;i < max_link_length;i++) {
        Node* tmp = (Node*) malloc (sizeof(Node));
        list->next = tmp;
        tmp->value = i;
        tmp->pre = list;
        tmp->next=NULL;
        printf("%d,",tmp->value);
        list = tmp;
    }
    return dulLink;
}

///init a link
void destory(Node* dulLink) {
    if(dulLink == NULL) {
        return;
    }
    Node* list=dulLink;
    list->pre = NULL;
    while(dulLink != NULL) {
        list = dulLink;
        dulLink=dulLink->next;
        list->pre = NULL;
        list->next = NULL;
        printf("%d,",list->value);
        free(list);
    }
    printf("\n");
}
///init a link
DulLink ergodic(Node *dulLink) {
    if(dulLink == NULL) {
        return dulLink;
    }
    Node* list = dulLink;
    while(list) {
        printf("%d,",list->value);
        list=list->next;
    }
    printf("\n");
}
DulLink insert (Node* dulLink, int i,int value) {
    if(dulLink == NULL) {
        return dulLink;
    }
    Node * tmp = (Node*) malloc(sizeof(Node));
    tmp->value = value;
    tmp->next = NULL;
    if(i == 0) {
        tmp->next = dulLink;
        dulLink->pre=tmp;
        dulLink = tmp;
        return tmp;
    }
    ///找插入点的前驱
    Node* preList = dulLink;
    while(preList && --i > 0) {
        preList = preList->next;
    }
    ///如果位置找的不对就直接退出
    if(preList == NULL|| i > 0) {
        return dulLink;
    }
    if(preList->next) {
        tmp->next = preList->next;
        preList->next->pre = tmp;
    }
    preList->next = tmp;
    tmp->pre = preList;
    return dulLink;
}

DulLink deleteOneElem (Node* dulLink, int i) {
    if(dulLink == NULL) {
        return dulLink;
    }
    ///找删除点
    Node* preList = dulLink;
    while(preList && --i >= 0) {
        preList = preList->next;
    }
    ///如果位置找的不对就直接退出
    if(preList == NULL|| i >= 0) {
        return dulLink;
    }
    if(preList->pre && preList->next) {
        preList->next->pre = preList->pre;
        preList->pre->next = preList->next;
    }
    if(preList->pre && preList->next == NULL) {
        preList->pre->next = NULL;
    }
    if(preList->pre ==NULL && preList->next) {
        dulLink = preList ->next;
        dulLink->pre = NULL;
    }
    free(preList);
    return dulLink;
}

DulLink updateOneElem (Node* dulLink, int i, int value) {
    if(dulLink == NULL) {
        return dulLink;
    }
    ///找删除点
    Node* preList = dulLink;
    while(preList && --i >= 0) {
        preList = preList->next;
    }
    ///如果位置找的不对就直接退出
    if(preList == NULL|| i >= 0) {
        return dulLink;
    }
    preList->value = value;
    return dulLink;
}
///查询一个元素
DulLink selectOneElem (Node* dulLink, int i) {
    if(dulLink == NULL) {
        return NULL;
    }
    ///找删除点
    Node* preList = dulLink;
    while(preList && --i >= 0) {
        preList = preList->next;
    }
    ///如果位置找的不对就直接退出
    if(preList == NULL|| i >= 0) {
        return NULL;
    }
    return preList;
}
Node* revertDulLink(Node* list) {
     if(list == NULL) {
        return list;
    }
    Node* tmp=list->next,*now ;
    while(tmp->next ) {
        now = tmp->next;
        tmp->next = now->next;
        if(now->next) {
            now->next->pre = tmp;
        }
        now->next = list->next;
        list->next->pre = now;
        list->next = now;
        now->pre = list;
    }
    return list;
}


int main()
{
    Node* dulLink=NULL;
    dulLink = init(dulLink);
    ergodic(dulLink);
    dulLink = insert(dulLink, 20, 888);
    ergodic(dulLink);
    dulLink = deleteOneElem(dulLink,20);
    ergodic(dulLink);
    updateOneElem(dulLink, 5, 999);
    Node* now = selectOneElem(dulLink,5);
    if(now){
        printf("%d\n",now->value);
    }
    ergodic(dulLink);
    dulLink = revertDulLink(dulLink);
    ergodic(dulLink);
    destory(dulLink->next);
    ergodic(dulLink);
    return 0;
}

    
    
   
   
  
  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值