1.实现单向循环链表的功能
loop.c
#include "loop.h"
 loop_p create_loop()
 {
     loop_p H=(loop_p)malloc(sizeof(loop));
     if(H==NULL)
     {
         printf("创建失败\n");
         return NULL;
     }
     H->len=0;
     H->next=H;  
     return H;        
 }
loop_p create_node(datatype data)
 {
     loop_p new=(loop_p)malloc(sizeof(loop));
     if(new==NULL)
     {
         printf("空间申请失败\n");
         return NULL;
     }
     new->data=data;
     return new;
 }
void insert_head(loop_p H,datatype data)
 {
     if(H==NULL)
     {
         printf("入参为空\n");
         return;
     }
     loop_p new = create_node(data);
     new->next = H->next;
     H->next = new;
     H->len++;
 }
void insert_pos(loop_p H,datatype data,int pos)
 {
     if(H==NULL)
     {
         printf("入参为空\n");
         return;
     }
     loop_p p = H;
     for(int i=0;i<pos-1;i++)
     {
         p=p->next;
     }
     loop_p new=create_node(data);
     new->next=p->next;
     p->next=new;
     H->len++;
 }
void del_tail(loop_p H)
 {
     if(H==NULL)
     {
         printf("入参为空,请检查\n");
         return;
     }
     loop_p temp = H;
     while(temp->next->next!=H)
     {
         temp=temp->next;
     }
     loop_p del=temp->next;
     temp->next=temp->next->next;
     free(del);
     H->len--;
 }
void del_pos(loop_p H,int pos)
 {
     if(H==NULL)
     {
         printf("入参为空,请检查\n");
         return;
     }
     if(pos<=0||pos>H->len)
     {
         printf("位置不合理\n");
         return;
     }
     loop_p temp=H;
     for(int i=0;i<pos-1;i++)
     {
         temp=temp->next;
     }
     loop_p del=temp->next;
     temp->next=temp->next->next;
     free(del);
     H->len--;
 }
void out_put_loop(loop_p H)
 {
     if(H==NULL)
     {
         printf("入参为空,请检查\n");
         return;
     }
     loop_p p = H->next;
     while(p!=H)
     {
         printf("%d\t",p->data);
         p=p->next;
     }
     putchar(10);
 }
main.c
 #include "loop.h"
 int main()
 {
     loop_p H=create_loop();
     insert_head(H,4);
     insert_head(H,3);
     insert_head(H,2);
     insert_head(H,1);
     del_tail(H);
     del_pos(H,2);
     out_put_loop(H);
     return 0;
 }
2.思维导图
见上一次作业
3.重写一遍链表逆置函数
void ovtu_link(link_p H)
 {
     if(H==NULL)
     {
         printf("入参为空,请检查\n");
         return;
     }
     if(link_empty(H))
     {
         printf("链表为空\n");
         return;
     }
     if(H->next->next==NULL)
     {
         printf("表中只有一个元素,无需翻转\n");
         return;
     }
     link_p p = H->next->next;
     H->next->next = NULL;
     link_p q = p->next;
     while(p!=NULL)
     {
         p->next=H->next;
         H->next=p;    
         p=q;
         if(q!=NULL)
         {
             q=q->next;
         }
     }
 }



















