• 数据结构循环链表算法具体实现


    #include<stdio.h>
    #include<stdlib.h>
    //线性表的循环链表分配顺序存储结构
    #define LIST_INIT_SIZE 100//线性表存储空间的初始分配量
    #define LISTINCREMENT 10//线性表存储空间的分配增量
    //函数结果状态代码
    #define TRUE 1
    #define FALSE 0
    #define OK 1
    #define ERROR 0
    #define INFEASIBLE -1
    #define OVERFLOW -2
    typedef int Status;//Status是函数的类型,其值是函数结果状态代码
    typedef int ElemType;
    //线性表的循环链表动态分配顺序存储结构
    typedef struct CircleNode{
        ElemType data;//存储空间基址
        struct CircleNode *next;
    }CircleNode,*CircleLinkList;
    Status InitList_CL(CircleLinkList &L)
    {
        //操作结果:返回一个空的线性表L
        L=(CircleLinkList)malloc(sizeof(struct CircleNode));//产生头结点,并使L指向此头结点
        if(!L)
            return OVERFLOW;//存储分配失败
        L->next=L;//指针域指向头结点
        printf("初始化线性表成功\n");
        return OK;
    }//InitList_CL
    //销毁线性表L
    Status DestroyList_CL(CircleLinkList &L)
    {
        CircleLinkList p=L,q=L->next;
        while(p!=L)//循环一直到表尾
        {
            p->next=q->next;
            free(q);
            q=p->next;
        }
        free(L);
        L=NULL;
        printf("销毁线性表成功\n");
        return OK;
    }//DestroyList_CL
    Status ClearList_CL(CircleLinkList &L)
    {
        //初始条件:线性表L已存在。操作结果:将L重置为空表
        CircleLinkList p=L,q=L->next;//p 指向头结点,q指向第二个节点
        while(p!=L)
        {
            p->next=q->next;
            free(q);
            q=p->next;
        }
        printf("清空线性表成功\n");
        return OK;
    }//ClearList_CL
    Status ListEmpty_CL(CircleLinkList L)
    {
        //初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE
        CircleLinkList p=L->next;
        if(p==L)
            return TRUE;
        else
            return FALSE;
    }//ListEmpty_CL
    Status ListLength_CL(CircleLinkList L)
    {
        //初始条件:L已存在。操作结果:返回L中数据元素个数
        CircleLinkList p=L,q=L->next;
        int i=0;
        while(q!=L)
        {
            ++i;
            q=q->next;
        }
        return i;
    }//ListLength_CL
    Status GetElem_CL(CircleLinkList L,int i,ElemType &e)
    {
        //当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
        CircleLinkList p=L,q=L->next;
        int j=1;
        if(i<1||i>ListLength_CL(L))return ERROR;
        while(j<i)
        {
            ++j;
            q=q->next;
        }
        e=q->data;
        return OK;
    }//GetElem_CL
    Status LocateElem_CL(CircleLinkList L,ElemType &e,Status (*compare)(ElemType,ElemType))
    {
        //初始条件:线性表L已存在,compare()是数据元素判定函数
        //操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。
        //    若这样的数据元素不存在,则返回值为0
        int i=0;
        CircleLinkList p=L->next;
        while(p!=L)
        {
            ++i;
            if((*compare)(p->data,e))
            {
                return i;
            }
            p=p->next;
        }
    }//LocateElem_CL
    Status compare(ElemType e1,ElemType e2)
    {
        if(e1==e2)
            return OK;
    }
    Status PriorElem_CL(CircleLinkList L,ElemType cur_e,ElemType &pre_e)
    {
        //初始条件:线性表L已存在
        //操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱
        //否则操作失败,pre_e无定义
        CircleLinkList p=L->next;
        while(p&&p->next&&p->next!=L)
        {
            if(p->next->data==cur_e)
            {
                pre_e=p->data;
                return TRUE;
            }
            p=p->next;
        }
        return ERROR;
    }
    //PriorElem_CL
    Status NextElem_CL(CircleLinkList L,ElemType cur_e,ElemType &next_e)
    {
        // 初始条件:线性表L已存在
        // 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继
        // 否则操作失败,next_e无定义
        CircleLinkList p=L->next;
        while(p&&p->next&&p->next!=L)
        {
            if(p->data==cur_e)
                next_e=p->next->data;
            return TRUE;
        }
        return ERROR;
    }//NextElem_CL
    Status ListInsert_CL(CircleLinkList &L,int i,ElemType e)
    {
        //在L的第i个位置之前插入元素e
        int j=0;
        CircleLinkList q=L;
        if(i<1||i>ListLength_CL(L)+1)return ERROR;
        while(j<i-1)
        {
            ++j;
            q=q->next;
        }
        CircleLinkList s=(CircleLinkList)malloc(sizeof(struct CircleNode));
        s->data=e;
        s->next=q->next;
        q->next=s;
        return OK;
    }//ListInsert_CL
    Status LinkDelete_CL(CircleLinkList &L,int i,ElemType &e)
    {
        //删除L的第i个元素,并由e返回其值
        int j=0;
        CircleLinkList q=L,p;
        if(i<1||i>ListLength_CL(L))return ERROR;
        while(j<i-1)
        {
            ++j;
            q=q->next;
        }
        p=q->next;
        q->next=p->next;
        free(p);
    }//LinkDelete_CL
    Status ListTraverse_CL(CircleLinkList L,Status (*visit)(ElemType e))
    {
        CircleLinkList p=L->next;
        printf("线性表遍历结果:");
        while(p!=L)
        {
            if((*visit)(p->data))
                printf("%d,",p->data);
            p=p->next;
        }
        printf("\n");
        return OK;
    }//ListTraverse_CL
    Status visit(ElemType e)
    {
        return OK;
    }
    int main(void)
    {
        CircleLinkList L;
        ElemType e,pre_e,next_e;
        InitList_CL(L);
        ListInsert_CL(L,1,1);
        ListInsert_CL(L,2,2);
        ListTraverse_CL(L,visit);
        if(!ListEmpty_CL(L))
            printf("线性表不为空\n");
        GetElem_CL(L,1,e);
        printf("线性表第1个元素为:%d\n",e);
        printf("线性表元素为1的位序为:%d\n",LocateElem_CL(L,e,compare));
        PriorElem_CL(L,2,pre_e);
        printf("线性表元素为2的前驱为:%d\n",pre_e);
        NextElem_CL(L,1,next_e);
        printf("线性表元素为1的后继为:%d\n",next_e);
        //printf("线性表删除位序1后:");
        LinkDelete_CL(L,1,e);
        ListTraverse_CL(L,visit);
        ClearList_CL(L);
        DestroyList_CL(L);
        getchar();
        getchar();
        return 0;
    }

  • 相关阅读:
    AcWing 1027. 方格取数 dp
    AcWing 1014. 登山 dp
    acwing 482. 合唱队形 dp
    LeetCode 1463. 摘樱桃II dp
    LeetCode 100. 相同的树 树的遍历
    LeetCode 336. 回文对 哈希
    LeetCode 815. 公交路线 最短路 哈希
    算法问题实战策略 DARPA大挑战 二分
    算法问题实战策略 LUNCHBOX 贪心
    AcWing 1100. 抓住那头牛 BFS
  • 原文地址:https://www.cnblogs.com/panguchuangshi/p/5846397.html
Copyright © 2020-2023  润新知