单,双向循环链表的操作

 

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

你可能感兴趣的:(链表)