zoukankan      html  css  js  c++  java
  • 单,双向循环链表的操作

     

    1,问题描述:

     某个单向循环链表的长度大于1,且表中既无头结点也无头指针。S为指向链表中的某个结点指针,编写算法删除指针S所指结点的前驱结点

      问题分析:

     循环链表的特点是最后一个结点的指针域指向头结点,整个链表形成一个环,因此可以从表中任一结点出发均可找到表中的其他结点。

      算法如下:

    Status ListDelete_CL(LinkList &S)
    {
       LinkList p,q;
       If(s==s->next) return error;//这个条件也让你更好地理解下面的内容呢。
       q=s;
       p=s->next;
      If(p->next!=s)
      {
       q =p;
       p=p->next;
       }
     q->next=p->next;
     Free(p);
      Return OK;
     }

    2,问题描述:

     已知一个单向循环链表,每个结点含三个域:priordata,和next,其中data为数据域,next为指向后继结点的指针域,prior为指针域,值为null,试编写算法将此单向循环链表改为双向循环链表,即使prior成为指向前驱结点的指针域。

     问题分析:

     线性表的双向链表存储结构为:

    typedef  struct DuLNode{
     ElemType  data;
     Struct  DuLNode  *prior;//前驱结点
     Struct  DuLNode  *next;//后继结点
     }DuLNode,*DuLinkList;

    双向链表的结构特性可用这个表达式来理解

       d->next->prior=d->prior->next=d;

       dDuLinkList型变量,这样应该比较好理解,并且也很清晰

    //先建立一个空的循环链表
    Status LinkList_DL(DuLinkList  &L)
    {
       L=(DuLinkList)malloc(sizeof(DuLNode));
       If(!L) exit(OVERFLOW);
       L->pre=null;//前驱为空
       L->next=L;//后继为本身
       Return OK;
    }
    //向循环链表中插入一个结点
    Status ListInsert_DL(DuLinkList  &L, ElemType e)
    {
       DuLinkList p;
       P=(DuLinkList)malloc(sizeof(DuLNode));
       If(!p)
    Return error;
    P->data=e;
    P->next=L->next;
    L->next=p;
    Return  OK;
    }
    //将单链表改成双链表
    Status ListCirToDu(DuLinkList  &L)
    {
    DuLinkList p,q;
     q =L;
     P=L->next;
    While(p!=L)
    {
      P->prev=q;
       q=p;
    P=p->next;
    
    }
    
    If(P==L) p->prev=q;//窃以为这个是改成双链表的关键,照理解的哪个公式,现在对这个推导有了进一步的认识。
    Return OK;
    }

     

     

    3,问题描述:

      由一个线性链表表示的线性表中含有三类字符的数据(如:字母字符,数字字符,和其他字符),编写算法将该线性表分割为三个循环链表,其中每个循环链表表示的线性表中均只含一类字符

     

      问题分析:

      主要是将线性表分成三个循环链表

     

      算法:

      

    Status ListDivideInto3CL(LinkList &L,LinkList &s1,LinkList &s2,LinkList &s3)
    {
      LinkList p,q,pt1,pt2,pt3;
     P=L->next;
     Pt1=s1;
     Pt2=s2;
     Pt3=s3;
     While(P)
    {
    If(p->data>=’0’&&p->data<=’9’)
    {
        Q=p;
        P=p->next;
        Q->next=pt1->next;
       Pt1->next=q;
       Pt1=pt1->next;
    }
    Else 
       If((p->data>=’a’&&p->data<=’z’)||(p->data>=’A’&&p->data<=’Z’))
        {
          Q=p;
          P=p->next;
          Q->next=pt2->next;
          Pt2->next=q;
          Pt2=pt2->next;
         }
      Else
       {
          Q=p;
          P=p->next;
          Q->next=pt3->next;
          Pt3->next=q;
          Pt3=pt3->next;
       }
    }
    q =L;
    Free(q);
    Return ok; 
    }

     

    此题的算法感觉只实现了拆分,怎样把这三个单链表编程循环链表并没有实现。

     

    按我的想法建立三个链表不仅仅只用到一个q,每个都需要一个 q1,q2,q3 当链表是相应的字符类型时,就保存到相应的q中,然后再将q的值填充到此链表,最后结束的时候,是 while循环退出后,在后面加上循环,需不需要呢?

  • 相关阅读:
    Django的forms.ModelForm自定义特殊条件认证。
    对象的属性输出,魔法方法__dict__
    Django从model对象里面提取出字段与属性,并转换成字典。
    刚刚想起猴子布丁,查了点资料,自己实践了下,记录汇总下。
    HTTP通信传输过程详解。
    jsp->jar
    Python overall structer
    SaaS成熟度模型分级:
    FW: linux screen -recorder by ffcast convert
    time-based DB
  • 原文地址:https://www.cnblogs.com/wj204/p/3044237.html
Copyright © 2011-2022 走看看