双链表的增删查改   一.双向链表的初始化 二.创建返回链表的头结点 三.双向链表销毁 四. 双向链表打印 五.双向链表尾插 六. 双向链表尾删 七. 双向链表头插 八.双向链表头删 九.双向链表的查找 十.双向链表在pos的前面进行插入 十一. 双向链表删除pos位置的节点   
 
ListNode*  LTInit ( ) 
{ ListNode*  Phead =  ListCreate ( - 1 ) ; Phead-> next =  Phead; Phead-> prev =  Phead; return  Phead; 
} 
ListNode*  ListCreate ( LTDataType x) 
{ ListNode*  newnode =  ( ListNode* ) malloc ( sizeof ( ListNode) ) ; if  ( newnode ==  NULL ) { perror ( "malloc fial" ) ; exit ( - 1 ) ; } newnode-> data =  x; newnode-> next =  NULL ; newnode-> prev =  NULL ; 
} void  ListDestory ( ListNode*  pHead) 
{ assert ( pHead) ; ListNode*  cur =  pHead-> next; while  ( cur !=  NULL ) { ListNode*  next =  cur-> next; free ( cur) ; cur =  next; } free ( pHead) ; 
} 
void  ListPrint ( ListNode*  pHead) 
{ assert ( pHead) ; printf ( "哨兵位" ) ; ListNode*  cur =  pHead-> next; while  ( cur !=  pHead) { printf ( "%d >> " ,  cur-> data) ; cur =  cur-> next; } printf ( "\n" ) ; 
} 
void  ListPushBack ( ListNode*  pHead,  LTDataType x) 
{ ListNode*  tail =  pHead-> prev; ListNode*  newnode =  ListCreate ( x) ; newnode-> prev =  tail; newnode-> next =  pHead; pHead-> prev =  newnode; tail-> next =  newnode; } 
void  ListPopBack ( ListNode*  pHead) 
{ assert ( pHead) ; assert ( pHead-> next !=  pHead) ; ListErase ( pHead-> prev) ; 
} 
void  ListPushFront ( ListNode*  pHead,  LTDataType x) 
{ assert ( pHead) ; ListNode*  newnode =  ListCreate ( x) ; newnode-> next =  pHead-> next; pHead-> next-> prev =  newnode; newnode-> prev =  pHead; pHead-> next =  newnode; 
} 
void  ListPopFront ( ListNode*  pHead) 
{ assert ( pHead) ; assert ( pHead-> next !=  pHead) ; ListErase ( pHead-> next) ; } 
ListNode*  ListFind ( ListNode*  pHead,  LTDataType x) 
{ ListNode*  cur =  pHead-> next; while  ( cur !=  pHead) { if  ( cur-> data ==  x) { return  cur; } cur =  cur-> next; } return  NULL ; 
} void  ListInsert ( ListNode*  pos,  LTDataType x) 
{ assert ( pos) ; ListNode*  posPrev =  pos-> prev; ListNode*  newnode =  ListCreate ( x) ; posPrev-> next =  newnode; newnode-> prev =  posPrev; newnode-> next =  pos; pos-> prev =  newnode; 
} 
void  ListErase ( ListNode*  pos) 
{ assert ( pos) ; ListNode*  posNext =  pos-> next; ListNode*  posprev =  pos-> prev; posprev-> next =  posNext; posNext-> prev =  posprev; free ( pos) ; pos =  NULL ; }