C语言实现双向链表之具体实现

/*
 * list.c
 *
 *  Created on: Nov 1, 2010
 *      Author: jenson
 */

#include "list.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

dr_list drl_create() {
    dr_list list = (dr_list) malloc(sizeof(struct _dr_list_));
    if (list == NULL) {
        perror("drl_create list.\n");
    }
    return list;
}

int drl_init(dr_list list) {
    if (list == NULL) {
        perror("drl_init null list.\n");
        return -1;
    }
    list->pre = list->next = list;
    return 1;
}

int drl_destroy(dr_list list) {
    if (list != NULL) {
        free(list);
        return 1;
    }
    perror("drl_destroy null list.\n");
    return -1;
}
int drl_empty(dr_list list) {
    return (list == NULL && list->pre == list->next);
}

int drl_delete_head(dr_list list) {
    if (!drl_empty(list)) {
        dr_list p = list;
        dr_list q = p->next;
        p->next->pre = p->pre;
        p->pre->next = p->next;
        free(q);
        return 1;
    }
    perror("drl_delete_head empty or null list.\n");
    return -1;
}

int drl_length(dr_list list) {
    if (!drl_empty(list)) {
        int len = 0;
        dr_list p = list;
        dr_list q = list;
        while (p->next != q) {
            p = p->next;
            len++;
        }
        return len;
    }
    perror("drl_length null list.\n");
    return -1;
}

int drl_get(dr_list list, int pos, elem_type *val) {
    if (!drl_empty(list)) {
        int len = drl_length(list);
        if (pos > 0 && pos < len) {
            int j = 0;
            dr_list p, q;
            p = list;
            q = list;
            while (p->next != q && j < pos - 1) {
                p = p->next;
                ++j;
            }
            if (p->next == q && j > pos) {
                perror("drl_get can not find.\n");
                return -1;
            }
            *val = p->next->data;
            return 1;
        } else {
            perror("drl_get invalid pos.\n");
            return -1;
        }
    } else {
        perror("drl_get empty list.\n");
        return -1;
    }
}

int drl_insert_head(dr_list list, elem_type e) {
    if (!drl_empty(list)) {
        dr_list head = list;
        dr_list s = (dr_list) malloc(sizeof(struct _dr_list_));

        if (s == NULL) {
            perror("drl_insert_head malloc s.\n");
            return -1;
        }

        s->data = e;

        s->pre = head->pre;
        head->pre->next = s;
        head->pre = s;
        s->next = head;

        return 1;
    }
    perror("drl_insert_head null list.\n");
    return -1;
}

int drl_insert_tail(dr_list list, elem_type e) {
    if (!drl_empty(list)) {
        dr_list header = list;
        dr_list tail = header->pre;

        dr_list s = (dr_list) malloc(sizeof(struct _dr_list_));
        if (s == NULL) {
            perror("drl_insert_tail malloc s.\n");
            return -1;
        }

        s->data = e;
        header->pre = s;
        s->next = header;
        tail->next = s;
        s->pre = tail;

        return 1;
    }
    perror("drl_insert_tail list is null.\n");
    return -1;
}

dr_list drl_get_tail(dr_list list) {
    if (!drl_empty(list)) {
        dr_list p = list;
        return p->pre;
    }
    perror("drl_get_tail empty list.\n");
    return NULL;
}

dr_list drl_get_header(dr_list list) {
    if (!drl_empty(list)) {
        dr_list p = list;
        return p->next;
    }
    perror("drl_get_header null list.\n");
    return NULL;
}

void drl_display(dr_list list) {
    if (!drl_empty(list)) {
        dr_list p = list;
        dr_list q = list;
        while (p->next != q) {
            printf("%d\t", p->next->data);
            p = p->next;
        }
    }
}

int drl_local(dr_list list, elem_type e) {
    if (!drl_empty(list)) {
        dr_list p = list;
        dr_list q = list;
        int pos = 0;
        while (p->next != q) {
            pos++;
            if (p->next->data == e) {
                return pos;
            }
            p = p->next;

        }
        return -1;
    }
    perror("drl_local empty list.\n");
    return -1;
}

int drl_delete(dr_list list, int pos, elem_type* e) {
    if (!drl_empty(list)) {
        dr_list p = list;
        dr_list q ;
        int len = drl_length(list);
        if (pos >= 0 && pos <= len) {
            int j = 0;
            while (p->next != q && j < pos - 1) {
                p = p->next;
                j++;
            }
          q = p->next;
          p->next->next->pre = p;
          p->next = p->next->next;
          *e = q->data;
          free(q);
          return 1;
        } else {
            perror("drl_delete invalid pos.\n");
            return -1;
        }
    }
    perror("drl_delete empty list.\n");
    return -1;
}

你可能感兴趣的:(算法,职场,休闲)