双向链表

前提

首先定义节点类型,是一个带头和尾的链表,头结点和尾节点都不存放数据,空链表时,他们首尾相连。
宏定义了需要存储的数据。

代码

#include <stdio.h>
#include <stdlib.h>
#define ElemType char


typedef struct LNode{
    ElemType data;
    struct LNode *prior;
    struct LNode *next;
}*Link,*Position;

typedef struct List{
    int len;
    Link head, tail;
} *LinkList;

int LocatePos(LinkList l, Link p){
    Link cur = l->head;
    for (int i = 0; i < l->len; ++i) {
        if(cur->next == p){
            return i;
        }
    }
    return -1;
};

int MakeNode(Link *p, ElemType e){
    (*p) = (Link)malloc(sizeof(struct LNode));
    (*p)->data = e;
    (*p)->next = (*p)->prior = NULL;
    return 0;
};

void FreeNode(Link *p){
    free(*p);
    *p = NULL;

};
int InitList(LinkList *l){
    (*l) = (LinkList)malloc(sizeof(struct List));
    (*l)->len = 0;
    Link head = NULL; Link *header = &head;
    MakeNode(header, (ElemType)NULL);
    Link tail = NULL; Link *tailer = &tail;
    MakeNode(tailer, (ElemType)NULL);
    (*l)->head = head, (*l)->tail = tail;
    head->next = tail;
    tail->prior = head;
    return 0;
};

int DeatoryList(LinkList *l){
    free(*l);
    *l = NULL;
    return 0;
};

int ClearList(LinkList l){
    Link cur = l->head;
    int length = l->len;
    for (int i = 0; i < length; ++i) {
        Link tem = cur->next;
        free(cur);
        cur = tem;

    }
    l->len = 0;
    return 0;
};

int InsFirst(LinkList l, Link s){
    Link h = l->head;
    s->next = h->next;
    s->prior = h;
    h->next = s;
    s->next->prior = s;
    l->len++;
    return 1;
}

Link DelFirst(LinkList l){
    Link cur = l->head;

    if(l->len == 0){
        return (Link)NULL;
    }
    Link temp = cur->next;
    cur->next = cur->next->next;
    cur->next->prior = cur;
    --l->len;
    return temp;


};

int Append(LinkList l, Link s){
    Link cur = l->tail->prior;
    cur->next = s;
    s->prior = cur;
    while (cur->next){
        l->len++;
        cur = cur->next;
    }
    cur->next = l->tail;
    l->tail->prior = cur;
    return 1;
};
Link Remove(LinkList l){
    if(l->len == 0){
        return NULL;
    }
    Link q = l->tail->prior;
    l->tail->prior = q->prior;
    q->prior->next = l->tail;
    l->len--;
    return q;

};
ElemType GetCurElem(Link p){
    return p->data;
}
int InsBefore(LinkList l, Link p, Link s){
    int pos = LocatePos(l,p);
    Link cur = l->head;
    if(pos != -1){
        for (int i = 0; i < pos; ++i) {
            cur = cur->next;
        }
        s->next = cur->next;
        s->prior = cur;
        s->next->prior = s;
        cur->next = s;
        l->len++;
        return 1;
    }
    return -1;
}
int insAfter(LinkList l, Link p, Link s){
    int pos = LocatePos(l,s);
    Link cur = l->head;
    if(pos != -1){
        for (int i = 0; i < pos; ++i) {
            cur = cur->next;
        }
        cur = cur->next;
        s->next = cur->next;
        s->prior = cur;
        s->next->prior = s;
        cur->next = s;
        l->len++;
        return 1;
    }
    return -1;
};
int SetCurElem(Link p, ElemType e){
    p->data = e;
};
int ListEmpty(LinkList l){
    if(l->len == 0){
        return 1;
    }
    return 0;
};
int ListLength(LinkList l){
    return l->len;
};
Position GetHead(LinkList l){
    return l->head;
};
Position GetLast(LinkList l){
    return l->tail;
}
Position PriorPos(Link p){
    return p->prior;
};
Position NextPos(Link p){
    return p->next;
};
int LocateNode(LinkList l, Link p){
    Link cur = l->head;
    int length = l->len;
    for (int i = 0; i < length; ++i) {
        if(cur->next->data == p->data){
            return i;
        }
        cur = cur->next;
    }
    return -1;
};
Position LocateElem(LinkList l, ElemType e){

    Link cur = l->head;
    int length = l->len;
    for (int i = 0; i < length; ++i) {
        if(cur->next->data == e){
            return cur->next;
        }
        cur = cur->next;
    }
    return NULL;

};

void ListTraverse(LinkList l){
    Link p = l->head;
    for (int i = 0; i < l->len; ++i) {
        printf("%c ",(char)p->next->data);
        p = p->next;
    }
    printf("\n");
};




int main() {
//    Link p = NULL; Link *pp = &p;
//    LinkList l = NULL; LinkList *ll = &l;
//    MakeNode(pp, 'a');
//    FreeNode(pp);
//    InitList(ll);
//    DeatoryList(ll);
//
//    InitList(ll);
//    for (int i = 0; i < 10; ++i) {
//        MakeNode(pp, (ElemType)(i+95));
//        InsFirst(l, p);
//    }

//    Link res = DelFirst(l);

//    MakeNode(pp,(ElemType)('*'));
//    Link first = p;
//    Link index = first;
//    for (int i = 0; i < 10; ++i) {
//        MakeNode(pp, (ElemType)(i+6));
//        index->next = p;
//        p->prior = index;
//        index = p;
//    }
//    Append(l, first);

//    Link res = Remove(l);

//    ClearList(l);
//    MakeNode(pp, 'g');
//    Link temp = p;
//    int res = LocatePos(l, p);

//    InsBefore(l,p,p);

//    insAfter(l,p,p);

//    ListTraverse(l);
//    Link res = LocateElem(l,'a');
    return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值