• 0x00数据结构——C语言实现(双链表)


    0x00数据结构——C语言实现(双链表)

    /*filename:double_linked_list.h*/
    /*
     双链表(double linked list)
    
     Functions:
     (在链表中增加附加头结点的版本)
        创建一个空线性表
        将链表置为空表
        计算表长度
        返回附加头结点的地址
        搜索函数:找x在表中的位置,返回表项位置
        定位函数:返回第i个表项在表中的位置
        取第i个表项的值
        用x修改第i个表项的内容
        插入x在表中第i个表项之后,函数返回成功标志
        删除表中第i个表项,通过x返回删除表项的值,函数返回成功标志
        判断表空,空返回真,否则返回假
        判断表满:满返回真,否则返回假
        输出
        对当前的表排序
    
    */
    
    #ifndef DOUBLE_LINKED_LIST
    #define DOUBLE_LINKED_LIST
    
    //假定每个表项的类型为T
    typedef int T;
    #define MAXLEN 100
    typedef enum {
        false = 0,
        true
    } BOOL;
    
    //双链表结点的数据结构。
    struct node;
    typedef struct node dnode;
    typedef struct node *to_node;
    typedef to_node d_list;
    typedef to_node pos;
    
    //创建一个空链表
    d_list create_list(void);
    
    //将链表置为空表
    BOOL set_empty(d_list l);
    
    //计算表长度
    int calc_length(d_list l);
    
    //返回附加头结点的地址
    d_list head_addr(d_list l);
    
    //搜索函数:找x在表中的位置,返回表项位置
    pos search(d_list l, T x);
    
    //定位函数:返回第i个表项在表中的位置
    pos locate(d_list l, int i);
    
    //取第i个表项的值
    T get_val(d_list l, int i);
    
    //用x修改第i个表项的内容
    BOOL change_val(d_list l, int i, const T x);
    
    //插入x在表中第i个表项之后,函数返回成功标志
    BOOL insert_val(d_list l, int i, const T x);
    
    //删除表中第i个表项,通过x返回删除表项的值,函数返回成功标志
    BOOL delete_val(d_list l, int i, T *x);
    
    //判断表空,空返回真,否则返回假
    BOOL isempty(d_list l);
    
    //输出
    void output(d_list l);
    
    //对当前的表排序
    BOOL sort(d_list l);
    
    #endif
    /*filename:double_linked_list.c*/
    #include <stdio.h>
    #include <stdlib.h>
    #include "double_linked_list.h"
    
    
    /*
    单链表结点的数据结构
    */
    struct node{
        T val;
        struct node *prev;
        struct node *next;
    };
    /*
    struct node;
    typedef struct node dnode;
    typedef struct node *to_node;
    typedef to_node d_list;
    typedef to_node pos;
    */
    
    //创建一个空单链表
    d_list create_list(void)
    {
        d_list l = (d_list)malloc(sizeof(dnode));
        l->next = NULL;
        l->prev = NULL;
        l->val = 0;
        return l;
    }
    //该双链表带头节点,头节点的val域存储链表的长度
    
    //将链表置为空表
    BOOL set_empty(d_list l)
    {
        pos tmp = l->next, ttemp;
        while(tmp!=NULL){
            ttemp = tmp->next;
            free(tmp);
            tmp = ttemp;
            }
        l->next = NULL;
        l->prev = NULL;
        l->val = 0;
        return true;
    }
    
    //计算表长度
    int calc_length(d_list l)
    {
        return l->val;
    }
    
    //返回附加头结点的地址
    pos head_addr(d_list l)
    {
        return l;
    }
    
    //搜索函数:找x在表中的位置,返回表项位置
    pos search(d_list l, T x)
    {
        int i = 1;
        pos tmp;
        tmp = l->next;
        while(tmp != NULL && tmp->val != x && i<=l->val){
            tmp = tmp->next;
            i++;
        }
        if(i>l->val) return NULL;
        else return tmp;
    }
    
    //定位函数:返回第i个表项在表中的位置
    pos locate(d_list l, int i)
    {
        if(i<=l->val && i>0){
            pos tmp;
            tmp = l;
            while(--i>=0 && tmp!=NULL){
                tmp = tmp->next;
            }
            return tmp;
        } else {
            printf("can not access the %d'th element
    ", i);
            return NULL;
        }
    }
    
    //取第i个表项的值
    T get_val(d_list l, int i)
    {
        if(i<=l->val && i>0){
            pos tmp;
            tmp = l;
            while(--i>=0 && tmp!=NULL){
                tmp = tmp->next;
            }
            return tmp->val;
        } else {
            printf("can not access the %d'th element
    ", i);
            return -1;
        }
    }
    
    //用x修改第i个表项的内容
    BOOL change_val(d_list l, int i, const T x)
    {
        if(i<=l->val && i>0){
            pos tmp;
            tmp = l;
            while(--i>=0 && tmp!=NULL){
                tmp = tmp->next;
            }
            tmp->val = x;
            return true;
        } else {
            return false;
        }
    }
    
    //插入x在表中第i个表项之后,函数返回成功标志
    BOOL insert_val(d_list l, int i, const T x)
    {
        if(i<=l->val && i>=0){
            pos tmp;
            tmp = l;
            while(--i>=0 && tmp!=NULL){
                tmp = tmp->next;
            }
            pos t = (pos)malloc(sizeof(dnode));
            t->next = tmp->next;
            if(tmp->next != NULL)
                (tmp->next)->prev = t;
            t->prev = tmp;
            tmp->next = t;
            t->val = x;
            l->val++;
            return true;
        } else {
            return false;
        }
    }
    
    //删除表中第i个表项,通过x返回删除表项的值,函数返回成功标志
    BOOL delete_val(d_list l, int i, T *x)
    {
        if(i<=l->val && i>0){
            i--;
            pos tmp;
            tmp = l;
            while(--i>=0 && tmp!=NULL){
                tmp = tmp->next;
            }
            *x = (tmp->next)->val;
    
            tmp->next = (tmp->next)->next;
            (tmp->next)->prev = tmp;
            l->val--;
            return true;
        } else {
            return false;
        }
    }
    
    //判断表空,空返回真,否则返回假
    BOOL isempty(const d_list l)
    {
        return (l->val == 0 ? true:false);
    }
    
    //输出
    void output(const d_list l)
    {
        pos tmp = NULL;
        int i = 1;
        tmp = l->next;
        while(tmp!=NULL){
            printf("the %dth element is %d
    ", i++, tmp->val);
            tmp = tmp->next;
        }
    }
    
    //对当前的表排序
    BOOL sort(const d_list l)
    {
        if(l->val < 2)
            return true;
        //冒泡排序
        pos tmp, tmp1, tmp2;
        int i;
        tmp = locate(l, l->val);
        while(tmp->prev != l) {
    
            tmp1 = l->next;
            tmp2 = tmp1->next;
            while(tmp1 != tmp) {
                if(tmp1->val > tmp2->val) {
                    i = tmp1->val;
                    tmp1->val = tmp2->val;
                    tmp2->val = i;
                }
                tmp1 = tmp1->next;
                tmp2 = tmp2->next;
            }
    
            tmp = tmp->prev;
        }
        return true;
    
        //快速排序
    
        //归并排序
    
    }
  • 相关阅读:
    POJ 2593&&2479:Max Sequence
    POJ 2115:C Looooops
    杭电2187--悼念512汶川大地震遇难同胞——老人是真饿了
    南阳448--寻找最大数
    杭电2544--最短路(Floyd)邻接表使用方法模板
    杭电2141--Can you find it?
    杭电1242--Rescue(BFS+优先队列)
    杭电1241--Oil Deposits(Dfs)
    南阳42--一笔画问题
    杭电1950--Bridging signals (二分法→ →LIS)
  • 原文地址:https://www.cnblogs.com/born2run/p/9581346.html
Copyright © 2020-2023  润新知