双链表

2021-03-25  本文已影响0人  qianranow

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int data;
    struct Node *prior, *next;
} DNode, *DLinkList;

int InsertNextDNode(DNode *p, DNode *s);
int DeleteNextDNode(DNode *p);

// 带头结点
DLinkList InitList() {
    DNode *p = (DNode *)malloc(sizeof(DNode));
    if (p == NULL) return NULL;
    p->prior = NULL;
    p->next = NULL;
    return p;
}

// 带头结点
int ListInsert(DLinkList l, int i, int e) {
    if (i < 1) return -1;
    DNode *p = l;
    int j = 0;
    while (p != NULL && j < i-1) {
        p = p->next;
        j++;
    }
    if (p == NULL) return -1;
    DNode *s = (DNode *)malloc(sizeof(DNode));
    if (s == NULL) return -1;
    s->data = e;
    s->next = NULL;
    InsertNextDNode(p, s);
    return 1;
}

// 带头结点
int ListDelete(DLinkList l, int i, int *e) {
    if (i < 1) return -1;
    DNode *p = l;
    int j = 0;
    while (p != NULL && j < i-1) {
        p = p->next;
        j++;
    }
    if (p == NULL) return -1;
    DNode *q = p->next;
    if (q == NULL) return -1;
    *e = q->data;
    return DeleteNextDNode(p);
}

// 通用接口
int InsertNextDNode(DNode *p, DNode *s) {
    if (p == NULL || s == NULL) return -1;
    s->next = p->next;
    if (p->next != NULL) {
        p->next->prior = s;
    }
    s->prior = p;
    p->next = s;
    return 1;
}

// 通用接口
int DeleteNextDNode(DNode *p) {
    if (p == NULL) return -1;
    DNode *q = p->next;
    if (q == NULL) return -1;
    p->next = q->next;
    if (q->next != NULL) {
        q->next->prior = p;
    }
    free(q);
    return 1;
}

// 通用接口
int Length(DLinkList l) {
    DNode *p = l;
    int i = 1;
    while (p->next != NULL) {
        p = p->next;
        i++;
    }
    return i;
}

// 通用接口
void PrintfList(DLinkList l) {
    DNode *p = l;
    while (p != NULL) {
        printf("%i\n", p->data);
        p = p->next;
    }
}

// 通用接口
int Empty(DLinkList l) {
    return l == NULL ? 1 : -1;
}

// 通用接口
void DestroyList(DLinkList *l) {
    while ((*l)->next != NULL) {
        DeleteNextDNode((*l));
    }
    free((*l));
    *l = NULL;
}

// 分割线
void Sep() {
    printf("**************\n");
}

int main() {
    DLinkList l = InitList();
    ListInsert(l, 1, 34);
    ListInsert(l, 2, 123);
    ListInsert(l, 2, 66);
    ListInsert(l, 4, 43);
    PrintfList(l->next);
    int e = -1;
    ListDelete(l, 3, &e);
    Sep();
    printf("%i\n", e);
    Sep();
    PrintfList(l->next);
    return 0;
}

上一篇 下一篇

猜你喜欢

热点阅读