单,双向循环链表的操作
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,问题描述:
已知一个单向循环链表,每个结点含三个域:prior,data,和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;
d为DuLinkList型变量,这样应该比较好理解,并且也很清晰
//先建立一个空的循环链表 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 当链表L 是相应的字符类型时,就保存到相应的q中,然后再将q的值填充到此链表,最后结束的时候,是 while循环退出后,在后面加上循环,需不需要呢?
作者:wj704
出处:http://www.cnblogs.com/wj204/