• 《数据结构》 循环链表和双向链表常用操作代码集合


    Ps:每段代码中,添加了署名Solo的代码为博主本人所写,其余来自课本或者老师。

    大量操作等同于单链表。重复的操作不再贴出,可以查看之前的博文。

    循环链表

    //结构体部分同单链表 略
    //初始化循环链表
    InitCLinkList(LinkList *CL)
    {
        *CL = (LinkList)malloc(sizeof(Node));    //建立循环链表的指针
        (*CL)->next = *CL;    //建立空的循环链表
    }
    //尾插法建立循环单链表
    void CreateCLinkList(LinkList CL)
    /*CL是定义好的,已经初始化好的、带头结点的空循环链表的头指针
    通过键盘输入元素值*/
    {
        Node *rear, *s;
        char c;
        rear = CL;    /*rear指针动态地指向链表的当前表尾,其初值指向头结点*/
    
        while((c = getchar()) != '$')
            {
                s = (Node *)malloc(sizeof(Node));
                s->data = c;
                rear->next = s;
                s = rear;
            }
         rear->next = CL;    /*最后一个节点的nxt域指向头结点*/
    }
    //循环链表的合并算法(1)
    LinkList merge_1(LinkList LA, LinkList LB)
    {   /*此算法将采用头指针的循环单链表的首尾链接起来*/
        Node *p,*q;
        p =LA;
        q = LB;
    
        while(p->next != LA) p = p->next;
        while(q->next != LB) q = q->next;
        q->next = LA;   //修改表LB的尾指针,指向表LA的头结点
        p->next = LB->next;    //修改LA的尾指针,指向LB的首元结点
        free(LB);
    
        return(LA);
    }
    //循环链表的合并算法(2)
    LinkList merge_2(LinkList RA, LinkList RB)     //注意,RA、RB是尾指针
    {   /*此算法将两个采用尾指针的循环单链表的首尾链接起来*/
        Node *p;
        p = RA->next;    /*保存链表RB的头结点地址*/
        RA->next = RB->next->next;    /*链表RB的开始结点链到链表RA的终端结点之后*/
        free(RB->next);    /*释放链表RB的头结点*/
        RB->next = p;    /*链表RB的开始结点链到链表RA的终端结点之后*/
    
        return RB;
    }

    双向链表

    //双向链表的结构体定义如下
    typedef struct DNode
    {
        ElemType data;
        struct DNode *prior, *next;
    } DNode, *DoubleList;
    #define OK 1
    #define ERROR 0
    //双向链表的前插操作
    int DlinkIns(DoubleList L, int i, ElemType e)
    {
        DNode *s, *p;
        p = L; k = 0;
    
        while(p && k<i)     //检查插入位置是否合法
            {
                p = p->next;
                k++;
            }
         if(!p || k>i)    return ERROR;
    
         s  = (DNode *)malloc(sizeof(DNode));
         if(s)
         {
             s->data = e;
             s->prior = p->prior;
             p->prior->next = s;
             s->next = p;
             p->prior = s;      //四个步骤不能换位置,否则会产生指针丢失
    
             return OK;
         }
    }
    //双向链表的删除操作
    int DLinkList(DoubleList L; int i; ElemType *e)
    {
        DNode *p;
        p = L; k = 0;
        while(p && k<i)     { p = p->next; k++}
        if(!p || k>i)    return ERROR;
    
        *e = p->data;
        p->prior->next = p->next;
        p->next->prior = p->prior;
        free(p);
    
        return OK;
    }


    zhihu:Solo | weibo@从流域到海域

  • 相关阅读:
    用数组实现的字符串和用指针实现的字符串
    c语言 10
    c语言 10-4
    函数间数组的传递,是以指向第一个元素的指针的形式进行传递的。
    openjudge7624 山区建小学
    NOIP2000 乘积最大
    openjudge6252 带通配符的字符串匹配
    codevs 3289 花匠
    codevs 3641 上帝选人
    各种子序列问题
  • 原文地址:https://www.cnblogs.com/wanghongze95/p/13842664.html
Copyright © 2020-2023  润新知