带表头的循环单项链表



#include <stdio.h>
#include <stdlib.h>

struct node        //定义结点的结构体
{
 int num;
 char name[100];

 struct node *next;
 struct node *prior;
};

typedef struct node Node;    //将struct node简单定义为Node
typedef struct node *Link;    //将stcuct node类型定义为*Link

void insert_node_head(Link  head, Link new_node) //头插
{
 new_node->next = head->next;
 new_node->prior = head;
 head->next = new_node;
 new_node->next->prior = new_node;
}

void insert_node_tail (Link head, Link new_node)   //尾插
{
 Link p = NULL;
    p = head;

 while(p->next != head)
 {
  p = p->next;
 }

 new_node->next = head;
 new_node->prior = p;
 p->next = new_node;
 new_node->next->prior = new_node;

}

void display_link_next (Link head)        //后继输出
{
 Link p ;
 p = head->next;

 if(p == head)
 {
  printf("Link is empty!\n");
  return;
 }

 while(p != head)
 {
  printf("num = %d\n",p -> num);
     printf("name = %s\n",p -> name);
  printf("\n");
  p = p -> next;     //下一个
 }
}

void display_link_prior (Link head)           //前驱输出
{
 Link p;
 p = head->prior;

 while(p != head)
 {
  printf("num = %d\n",p -> num);
     printf("name = %s\n",p -> name);
  printf("\n");
  p = p->prior;     //前一个 
 }
}

void release_link (Link head)             //释放链表
{
 Link p;
 Link q;
 p = head->next;
 q = head->next;
   
    while(head->next != head)
 {
//      q = p;
//     p = p -> next;
     p = head->next;
     head->next = (head->next)->next;
     
//      free(q);
     free(p);
 }
// head->next = head;      //使用p、q,在释放完p后,head后就没有指向,则必须加指向NULL,否则会段错误

}

void delete_node (Link head, int number)      //删除其中一个结点
{
    Link p = NULL;
 p = head->next;

 if(p == head)       //空
 {
  return;
 }
 else
 {
  if(p->num == number)         //第一个结点的num满足条件
  {
   p->next->prior = head;
   head->next = p->next;
   free(p);
  }
  else
  {
   while(p != head && p -> num != number)
   {
    p = p -> next;
   }

   if(p == head)           //未找到
   {
    printf("no node!\n");
   }
   else                      //删除的结点在中间
   {
    p->next->prior = p->prior;
    p->prior->next = p->next;
    free(p);
   }
  }
 }
}


int number_link (Link head)         //计算链表长度并返回
{
 Link p;
 p = head->next;
 int num = 0;

 while(p != head)
 {
  p = p -> next;
  num++;
 }

 return num;

}

Link find_link_next (Link  head, int n)        //查找对应学号所在结点内容,后继
{
 Link p;
 p = head->next;

 while(p -> num != n && p != head)
 {
  p = p -> next;
 }
 
 if(p->num == n)
 {
  return p;
 }
 else
 {
  printf("No find!\n");
  return;
 }
}

Link find_link_prior (Link head, int n)          //查找对应学好所在结点内容,前驱
{
 Link p;
 p = head->prior;

 while(p != head && p->num != n)
 {
  p = p->prior;
 }

 if(p->num == n)
 {
  return p;
 }
 else
 {
  printf("No find!\n");
  return;
 }
}

void enter_link_next (Link head, Link enter_node,int number)   //插入新的结点,插在所找结点的前面,后继
{
    Link p = NULL;
 p = head->next;

 while(p != head && p -> num != number)
 {
  p = p -> next;
 }
/*
 p->prior->next = enter_node;
 enter_node->prior = p->prior;
 enter_node->next = p;
 p->prior = enter_node;*/

    insert_node_head(p, enter_node);
}

void enter_link_prior (Link head, Link enter_node, int number)     //插入新的结点,插在所找结点的后面,前驱
{
 Link p = NULL;
 p = head->prior;

 while(p != head && p->num != number)
 {
  p = p->prior;
 }

 insert_node_tail(p, enter_node);

}

void search_change_node (Link head, Link change_node, int num)   //查找并修改
{
 Link p = NULL;
 p = head->next;

 while(p -> num != num && p != head)
 {
  p = p -> next;
 }

 if(p == head)  
 {
  printf("No find!");
  return;
 }
 else
 {
    enter_link_next(head,change_node,p->next->num);
 }
}

void insert_rank_node (Link head, Link new_node)         //插入的时候排序
{
 Link p = NULL;
 p = head->next;

 if(p == head)        //空
 {
  head->next = new_node;
  new_node -> next = head;
 }
 else if(p->next == head)    //一个结点
 {
        if(new_node->num > p->num)
  {
   p->next = new_node;
   new_node->next = head;
  }
  else
  {
   new_node->next = p;
   head->next = new_node;
  }
 }
 else                       //多个结点
 {
        if((p->num) > (new_node->num))     //第一个结点的学号大于new_node的学号,大于则new_node插最前面
  {
   new_node->next = p;
   head->next = new_node;
  }
  else
  {
   while(p->next != head)           //循环到最后一个结点
   {
                p = p->next;
   }

   if((p->num) < (new_node->num))     //比较最后一个结点的学号是否小于new_node的学号,小于则new_node插最后
   {
    p->next = new_node;
    new_node->next = head;
   }
   else                                
   {
    p = head->next;

    while(((p->next)->num) < (new_node->num))     //查找的结点在中间
    {
     p = p->next;
    }
    
    new_node->next = p->next;
    p->next = new_node;
   }
  }
 }
}


Link write_node(Link *new_node)       //写入
{
 *new_node = (Link)malloc(sizeof( Node ));   //创建一个新的结点

 if(*new_node == NULL)    //检查分配空间
 {
  printf("malloc error!\n");
  exit(-1);
 }


}

void create_link(Link * head)   //创建头指针,并定义为空指针
{
 write_node(head);
 (*head)->next = *head;
 (*head)->prior = *head;
}


int main()
{
 Link head = NULL;
 Link new_node = NULL;
 Link enter_node = NULL;
 Link change_node = NULL;
 int i;
 int n;
 int num;
 int number;

 create_link(&head);

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

        write_node(&new_node);       //写入
  
  scanf("%d",&(new_node)->num);  //赋值
  scanf("%s", new_node -> name);
  
//        insert_node_head(head, new_node);
  insert_node_tail(head, new_node);
//  insert_rank_node(head, new_node);
 }


 display_link_next(head); //输出
/*
 num = number_link(head);               //返回结点数
 printf("number = %d\n", num);

 printf("Please input the num, find the name:\n");
 scanf("%d",&n);
// printf("%s\n",find_link_next(head, n)->name);           // 输出查找号对应的名字
 printf("%s\n",find_link_prior(head, n)->name);
 printf("\n");

 printf("Please input the number of delete:\n");
 scanf("%d",&number);
    delete_node (head, number);       //删除其中一个结点
*/
// flashback_link(head);      //倒叙输出
/*
// enter_node = (Link)malloc(sizeof(Node));
 printf("Please input the name and number:\n");
 write_node(&enter_node);
 scanf("%d",&(enter_node->num));
 scanf("%s",enter_node->name);
 printf("Please input the number of enter:\n");
 scanf("%d",&number);
// enter_link_next(head, enter_node, number);    //在已经输入的结点里再插入一个新的结点
 enter_link_prior(head, enter_node, number);
*/
 printf("Please input the number of search and change:");
 scanf("%d",&num);                         //查找的学号
 write_node(&change_node);
 printf("Please input the number and name:");
    scanf("%d",&(change_node->num));          //修改的学号
 scanf("%s",change_node->name);            //修改的名字
 search_change_node(head, change_node, num);          //查找并修改

// display_link_next(head); //输出
 display_link_prior(head); //输出      

 release_link (head); //释放
   
 display_link_next(head);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值