zoukankan      html  css  js  c++  java
  • 双向链表模板

    //双链循环线性表的表示与实现
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #define TRUE 1
    #define FALSE 0
    #define OK 1
    #define ERROR 0
    #define INFEASIBLE -1
    #define OVERFLOW -2
    typedef int status;
    typedef int elemtype;
    typedef struct node {
        elemtype data;
        struct node *prior;
        struct node *next;
    } node, *linklist;
    
    //初始化双链循环线性表
    void initlist(linklist &l){
      l=(linklist)malloc(sizeof(node));
      l->next=l->prior=l;
    }
    
    //获取双链循环线性表中的元素
    node * GetElemP_Dul(linklist l, int i) {
         linklist p = l;
        if (i < 1)   //非法i值
            return NULL;
        if (p->next == l) //空双向循环链表
            return l;
        p = l->next;
        int j = 1;   //初始化, p指向第一个结点, j为计数器
        while(p != l && j < i) {  //顺指针向后查找, 直到p指向第i个元素或p指向头结点
            p = p->next;
             ++j;
        }
        return p;
    }
    status listinsert(linklist &l, int i, elemtype e) {
        //在带头结点的双链循环线性表L中第i个位置之前插入元素e
        //i的合法值为1 <= i <= 表长 + 1
        linklist p = NULL;
        if (!(p = GetElemP_Dul(l, i)))//在p节点前插入s
            return ERROR;
        linklist s = (linklist)malloc(sizeof(node));
        s->data = e;
        s->prior = p->prior; p->prior->next = s;
        s->next = p;         p->prior = s;
        return OK;
    }
    
    //删除元素
    status ListDelete_DuL(linklist &L, int i, elemtype &e) {
        //在带头结点的双链线性表L中, 删除第i个元素, 并由e返回其值
        //i的合法值为1 <= i <= 表长
        struct node *p = NULL;
        if (!(p = GetElemP_Dul(L, i)) || L == GetElemP_Dul(L, i))
            return ERROR;
        e = p->data;
        p->prior->next = p->next;
        p->next->prior = p->prior;
        free(p); return OK;
    }
    
    //遍历线性表
    status ListTraverse_DuL(linklist L, status (*Visit)(elemtype)) {
        printf("traverse list: ");
        struct node *p = L->next; //略过头结点
        while (p != L) {
            Visit(p->data);
            p = p->next;
        }
        return OK;
    }
    //访问线性表中的元素
    status Visit(elemtype e){
        printf("%d ", e);
        return OK;
    }
    
    //测试函数
    int  main(){
        linklist l;
         elemtype e;
        initlist(l);
        linklist p=l;
        for(int i=1;i<=10;i++)
        listinsert(l,i,i);
    
        ListTraverse_DuL(l, Visit);//遍历链表麻烦方法
    
              p=p->next;//遍历线性表简单方法
              while(p!=l){
              printf("%d ",p->data);
              p=p->next;
             }//end
    }
  • 相关阅读:
    深入类的方法
    泛型集合
    深入C#数据类型
    深入.net框架
    错题
    详解Python Graphql
    深入理解分布式调度框架TBSchedule及源码分析
    30分钟闲置服务器建站(gitlab为例)
    Webpack开发指南
    mybatis-generator
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/5036239.html
Copyright © 2011-2022 走看看