1、整理思维导图
 2、整理课上单向循环链表的代码
 3、完成双向链表的剩下四个功能

2、
node_p create_list()//创建链表
 {
     node_p p=(node_p)malloc(sizeof(node));
     if(p==NULL)
     {
         printf("申请失败\n");
         return NULL;
     }
     p->len=0;
     p->next=p;
     return p;
 }
 node_p create_node(datatype data)//申请结点
 {
     node_p p=(node_p)malloc(sizeof(node));
     if(p==NULL)
     {
         printf("申请失败\n");
         return NULL;
     }
     p->data=data;
     return p;
 }
 int empty_list(node_p p)//判空
 {
     if(p==NULL)
         return -1;
     return p->len==0;
 }
 void insert_head(node_p p,datatype data)//头插
 {
     if(p==NULL)
         return;
     node_p q=create_node(data);
     p->next=q;
     p->len++;
 }
 void dele_head(node_p p,datatype data)//头删
 {
     if(p==NULL||empty_list(p))
         return;
     node_p q=p->next;
     p->next=q->next;
     free(q);
     q=NULL;
     p->len--;
 }
 void insert_tail(node_p p,datatype data)//尾插
 {
     if(p==NULL)
         return;
     node_p q=p;
     while(p->next!=q)
     {
         p=p->next;
     }
     p->next=create_node(data);
     q->len++;
 }
 void dele_tail(node_p p)//尾删
 {
     if(p==NULL||empty_list(p))
         return;
     node_p q=p;
     while(p->next->next!=q)
     {
         p=p->next;
     }
     free(p->next);
     p->next=q;
     q->len--;
 }
 void insert_pos(node_p p,datatype data,int pos)//按位置插入
 {
     if(p==NULL||pos<0||pos>p->len-1)
         return;
     node_p q=p;
     for(int i=0;i<pos;i++)
     {
         p=p->next;
     }
     node_p r=p->next;
     p->next=create_node(data);
     p->next->next=r;
     q->len++;
 }
 void dele_pos(node_p p,int pos)//按位置删除
 {
     if(p==NULL||empty_list(p)||pos<0||pos>p->len-1)
         return;
     node_p q=p;
     node_p r=p->next->next;
     for(int i=0;i<pos;i++)
     {
         p=p->next;
     }
     free(p->next);
     p->next=r;
     q->len--;
 }
 void show_list(node_p p)//输出
 {
     if(p==NULL||empty_list(p))
         return;
     node_p q=p;
     p=p->next;
     while(p->next!=q)
     {
         printf("%d->",p->data);
         p=p->next;
     }
 }
 node_p DeleHead(node_p p)//删除头结点
 {
     if(p==NULL)
         return NULL;
     node_p q=p;
     while(p->next!=q)
     {
         p=p->next;
     }
     p->next=q->next;
     free(q);
     q=NULL;
     return p->next;
 }
 void show_nohead_list(node_p p)//输出无头结点的链表
 {
     node_p q=p;
     do{
          printf("%d->",p->data);
          p=p->next;
     }while(p!=q);
 }
3、

