循环链表

    最后一个元素的指针域不是空,而是指向了头结点。

 
  
  1. //判断表空由 
  2. L->next == NULL; 
  3. //变为 
  4. L->next == L; 
  5.  
  6. //判断表尾由 
  7. p->next == NULL; 
  8. //变为 
  9. p->next == L; 

    此时我们更多使用指向最后一个元素的尾指针,因为这个指针访问第一个元素和最后一个元素时的时间复杂度都是常数级。

双向链表

    基本结构

 
  
  1. typedef struct DulNode{ 
  2.     ElemType data; 
  3.     struct DulNode *next; 
  4.     struct DulNode *prior; 
  5. }DulNode,*DuLinkList 

    插入

 

 

 
  
  1. s->prior = p;//一定要先处理新结点的指针问题  
  2. s->next = p->next; 
  3. p->next->prior = s; 
  4. p->next = s; 
  5.  
  6. s->prior = p;//这种方式也可以  
  7. s->next = p->next; 
  8. p->next = s; 
  9. s->next->prior = s; 

    删除

 

 

 
  
  1. p->next->prior = p->prior; 
  2. p->prior->next = p->next;