问答题 假设有一个带头结点的单链表,根据此单链表编写一个函数,构造一个循环双链表。
【正确答案】(1)数据结构
   struct Node;
   typedef struct Node*PNode;
   structNode{
       int info;
       PNode link;
   };
   typedef struct Node*LinkList;
   struct DoubleNode;
   typedef struct DoubleNode*PDoubleNode;
   struct DoubleNode{
       int info;
       PDoubleNode llink,rlink;
   };
   typedef struct DoubleNode*DLinkList;
   (2)思路
   根据单链表的内容,一边复制数据,一边产生双链表,最后把双链表的头尾相接。
   (3)算法
   DLinkList convert(LinkList llist){
   /*返回根据LinkList llist指向的单链表创建的带头结点的循环双链表的指针,若创建失败,则返回NULL*/
   PNode pnode;
   DLinkList dllist;
   PDoubleNode pdnode,pdpre;
   dllist=createNullDList();
   if(dllist==NULL)return NULL;
   pdpre=dllist;
   for(pnode=llist->link;pnode!=NULL;pnode=pnode->link){
       pdnode=(PDoubleNode)maltoc(sizeof(struct DoubleNode));
       if(pdnode==NULL){
         freedlist(dllist);
         return NULL;
       }
       pdnode->info=pnode->info;
       pdpre->rlink=pdnode;
       pdnode->llink=pdpre;
       pdpre=pdnode;
   }
   pdpre->rlink=dllist;
   dllist->llink=pdpre;
   return dllist;
   }
   (4)代价分析
   最坏时间代价为O(n)。
【答案解析】本题也是给出一种带头结点的循环双链表的存储表示和一种构造方法。