您的位置:首页 > 其它

带表头的单向循环链表

2017-02-10 22:32 459 查看
#include<stdio.h>

#include<stdlib.h>

struct node

{   int num;

    char name[20];

    struct node * next;

};

typedef struct node Node;

typedef struct node * Link;

void all_malloc_ok (Link new_node)

{

    if (new_node == NULL)

    {

        printf("Fail!");

 exit(-1);

    }

}

Link creat_new_node(Link *new_node)

{

    *new_node = (Link)malloc(sizeof(Node));

    all_malloc_ok (*new_node);

}

void creat_link (Link * head)

{

    *head = creat_new_node(head);

    (*head)->next = *head;

}

void display (Link head)

{

    Link p;

    p = head->next;

    if ( p == head)

    {

        printf("The link is empty!");

        return ;

    }

    while (p != head)

    {

        printf("%4d:",p->num);

        printf("%s\n",p->name);

 p = p -> next;

    }

}

void insert_new_node_tail (Link head, Link new_node)

{

    Link p;

    p = head;

    while (p->next != head)

    {

       p = p->next;

    }

    new_node->next = head;

    p->next = new_node;

}

void insert_new_node_head (Link head, Link new_node)

{  

    Link p;

    p = head;

   

    new_node->next = p->next;

    p->next = new_node;

}

void release (Link *head)

{

    Link p;   

    p = *head;

    if(p == NULL)

    {

       return;

    }

   

    if (p->next = *head)

    {

        free(p);

 return ;

    }

    while(p->next != *head)

    {

        p = p->next;

    }

    p->next = NULL;

    while (*head != NULL)

    {

        p = *head;

 *head = (*head) -> next;

 free (p);

    }

}

int count (Link head)

{

    Link p;

    p = head;

    int n = 0;

   

    while ( p->next != head)

    {

        p = p->next;

 n++;

   

    }

    return n;

}

Link search (Link head,int n)

{

    Link p;

    p = head->next;

   

    while (p != head)

    {  

        if ( p->num == n)

        {

     break;

 }

        p = p->next;

    }

 

    return p;

}

Link search_before (Link head,int n)

{

    Link p;

    p = head->next;

    Link q;

    q = head;

    while (p != head)

    {

        if( p->num == n)

 {

    break;

 }

 q = p;

 p = p->next;

    }

    return q;

}

/*void modifier (Linak p)

{

    scanf("%s",p->name);

    printf("\n");

}*/

void delete1 (Link head, int n)

{

    Link p ;

    p = search (head,n);

    if(p == head)           

    {

     printf("没有这个值");

   

    }

    else if ((p->next) == head)

    {  

        search_before(head,n)->next = head;

        free(p);

    }

    else

    {

       ( search_before(head,n))->next = p ->next;

 free (p);

    }

}

void plus_node (Link head, int n)

    {

        Link p;

 Link new_node;

 creat_new_node(&new_node);

 new_node->num = 7;

 printf("输入新结点的名字");

 scanf("%s",new_node->name);

 p = search(head,n);

  if (p == head)

 {

     printf("Fail!");

 }

 else

 {

     search_before(head,n)->next = new_node;

     new_node->next = p;

 

 }

    }

void inverted_order (Link head)

{   

    Link p1 = NULL;

    p1 = head->next;

    Link p2 = NULL;

    Link p3 = NULL;

 

    if (p1 == head)

    {

        printf("Fail!\n");

    }

    else if (p1->next == head)

    {

        printf("There is only one node.\n");

    }

    else if ((p1->next)->next == head)

    {

        p2 = p1->next;

      

        p2->next = p1;

        p1->next = head;

        head->next = p2;

    }

    else

    {  

        p2 = p1->next;

        p3 = p2->next;

        p1->next = head;

        while (p3 != head)

        {

           p2->next = p1;

   // printf("*");

         //  p3->next = p2;

   

           p1 = p2;

    p2 = p3;

    p3 = p3->next;

        }

   p2->next = p1;

          head->next = p2;

     }

}

void insert_sort(Link head, Link new_node)

{

    Link p;

    p = head->next;

    int number = new_node->num;

    if (p == head)

    {

        head->next = new_node;

 new_node->next = head;

    }

    else if (number <= (p->num))

    {

        new_node->next = p;

 p  = new_node;

    }

    else if (number > (p->num))

    {

        while (p != head)

 {                 

            if (p->next == head)

            {

         p->next = new_node;

         new_node->next = head;

  break;

     }

            else if (number <= ((p->next)->num))

     {

        

  new_node->next = p->next;

         p->next = new_node;

  break;

     }

     else if (number > ((p->next)->num))

            {

         p = p->next;

     }

        }

    }           

}

int main ()

{

    Link head = NULL;
4000

    Link new_node = NULL;

    int i;

    int n;

    creat_link(&head);

    for (i = 1; i < 3; i++)

    {

        creat_new_node (&new_node);

        printf("输入第%d个名字:",i);

 scanf("%s",new_node->name);

        new_node->num = i;  

 insert_new_node_tail (head, new_node);

    }

       

    display (head);

    printf("有%d个结点.\n",count(head));

   

    printf("输入结点中成员num的值(查找名字):");

    scanf("%d",&n);

    if  (search(head,n) == head)

        printf("没有这个数。");

    else

    printf("%d : %s\n",n, search(head,n)->name);

   

    printf("输入需要删除的成员num的值:");

    scanf("%d",&n);

    delete1 (head,n);

    display (head);

   

    printf("输入一个值,加入一个结点:");

    scanf("%d",&n);

    plus_node(head,n);

    display(head);

 

   inverted_order (head);

    display (head);

    for (i = 0; i < 3; i++)

    {

        new_node = creat_new_node(&new_node);

 printf("输入插入的第%d个结点的num的值:\n",i + 1);

        scanf("%d",&new_node->num);

 printf("输入插入的第%d个结点的name的值:\n",i + 1);

 scanf("%s",new_node->name);

        insert_sort(head,new_node);

    }

    display(head);

    release(&head);

    display (head);

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: