单,双向循环链表的操作

 

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循环退出后,在后面加上循环,需不需要呢?

原文地址:https://www.cnblogs.com/wj204/p/3044237.html