拥有删除,增加,排序等功能的链表

来源:互联网 发布:win10壁纸windows聚焦 编辑:程序博客网 时间:2024/05/17 04:53
#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 creat_link (Link * head)              //创建链表函数(空链表)
{
    *head = NULL;
}
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 display (Link head)            //输出函数
{
    Link p;
    p = head;

    if ( p == NULL)
    {
        printf("The link is empty!");
        return ;
    }

    while (p != NULL)
    {
        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;

    if ( *head == NULL)
    {
        *head = new_node;
        (*head)->next = NULL;
    }
    else
    {   
         while ( p ->next != NULL)
  {
      p = p -> next;
  }
        
 p -> next = new_node;
         new_node -> next = NULL;

    }
}


void release (Link *head)                //将分配的空间释放
{
    Link p;
   
    p = *head;
    while (*head != NULL)
    {
        p = *head;
 *head = (*head) -> next;
 free (p);
    }
}

int count (Link head)             //统计所有的结点的函数
{
    Link p;
    p = head;
    int n = 1;

    while ( p->next != NULL)
    {
        p = p->next;
 n++;
   
    }
    return n;
}

Link search (Link head,int n)           //搜索函数,输入成员num值,寻找所在地址
{
    Link p;
    p = head;
   
    while (p != NULL)
    {  
        if ( p->num == n)
        {
     break;
 }
        p = p->next;
    }
 
    return p;
}
Link search_delete (Link head,int n)      //上一个函数的前一个结点的地址
{
    Link p;
    p = head;
    Link q ;
    q = head;
    while (p != NULL)
    {
        if( p->num == n)
 {
    break;
 }
 q = p;
 p = p->next;
    }
    return q;
}
/*void modifier (Link p)
{
    scanf("%s",p->name);
    printf("\n");
}*/

void delete1 (Link *head, int n)           //删除函数,注意:delete 不能作为函数名
{
    Link p ;
    p = search (*head,n);
    if(p == NULL)           
    {
     printf("没有这个值");
   
    }
    else if (p == *head)
    {
        *head = (*head)->next;
 free (p);
    }
    else if ((p->next) == NULL)
    {  
        search_delete(*head,n)->next = NULL;
        free(p);
    }
    else
    {
       ( search_delete(*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(*head == NULL)
 {
     *head = new_node;
 }
 else if (p == NULL)
 {
     printf("Fail!");
 }
 else if (p == *head)
 {
    new_node->next = *head;
    *head = new_node;
 }
 else
 {
     search_delete(*head,n)->next = new_node;
     new_node->next = p;
 
 }

   
    }

void inverted_order (Link *head)            //逆序函数,将所有结点按相反的顺序排放
{   
    Link p;
    p = *head;
    Link p1;
    Link p2;
    Link p3;
    p1 = p->next;
    p2 = p1->next;
    p3 = p2->next;
   
    if ( p == NULL)
    {
        printf("Fail!\n");
    }
    else if (p->next == NULL)
   {
       printf("There is only one node.\n");
   }
   else if (p1->next == NULL)
   {
       p1->next = p;
       p->next = NULL;
       *head = p1;
   }
   else if (p2->next == NULL)
   {
       p1->next = p;
       p2->next = p1;
       p->next = NULL;
       *head = p2;
   }
   else
   {
       while (p3->next != NULL)
       {
           p1->next = p;
           p2->next = p1;
    p = p1;
           p1 = p2;
    p2 = p3;
    p3 = p3->next;
       }
         p1->next = p;
  p2->next = p1;
  p3->next = p2;
         (*head)->next = NULL;
        *head = p3;
    }

}
void insert_sort(Link *head, Link new_node)   //创建节点,并有序的放在链表里,  (原来的链表是有序的)
{
    Link p;
    p = *head;
    int number = new_node->num;
   
    if (*head == NULL)
    {
        *head = new_node;
    }
    else if (number <= (p->num))
    {
        new_node->next = *head;
 *head = new_node;
    }
    else if (number > (p->num))
    {
        while (p !=NULL)
 {                 
            if (p->next == NULL)
            {
         p->next = new_node;
         new_node->next = NULL;
  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;
    Link new_node = NULL;
    int i;
    int n;
    creat_link(&head);

    for (i = 1; i < 5; 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) == NULL)
        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);
  
    return 0;
}
0 0
原创粉丝点击