单向循环链表正向输入,逆向输出

建立一个单向的循环链表,随机输入,经过排序,从小到大输出,

并在最后逆向输出(逆向输出的方式为让单向链表指向反向)

 

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

typedef struct list
{
 int data;
 struct list *next;

}link,*link_s;

link_s juage(link_s head,link_s link_list);
link_s creat_list(void);
link_s creat_new_list(int num);
void show_list(link_s head);
link_s reverse(link_s head);

int main(int argc, char const *argv[])
{  
 int num = 0;

 link_s head = creat_list();
   
 for (int i = 0; i < 10; ++i)
  {
   scanf("%d",&num);

   link_s link_list = creat_new_list(num);

   link_s p = juage(head,link_list);

   show_list(p);

  }
     printf("\n");
  show_list(reverse(head));

 return 0;
}


/**********对链表中数据进行从小到大排序*******************/
link_s juage(link_s head,link_s link_list)

 link_s p = head;
 
 // 找到插入的位置
 while(p->next != head)
 {
  if(p->next->data > link_list->data)
  {
   link_list->next = p->next;
   p->next = link_list;
   
   return head;
  }
  
  p = p->next;
 }
 
 // 比最后一个大的情况
 p->next = link_list;
 link_list->next = head;
 
 return head;
}

/**********创建一个空链表**************/
link_s creat_list(void)
{
 link_s head = NULL;//创建一个空链表
   
 head = malloc(sizeof(link));//给空链表分配一个地址空间
 //link_list->data = 0;
 head->next = head;//空链表指向本身
 
 return head;
}

/**************创建一个空链表并赋值*****************/
link_s creat_new_list(int num)
{
 link_s link_list = NULL;//创建一个空链表

 link_list = malloc(sizeof(link));//给空链表分配一个地址空间
    
 link_list->data = num;//将输入值n赋给数据位

 link_list->next = link_list;//空链表指向本身
  
 return link_list;
}

/***********************打印出链表中数据*********************/
void show_list(link_s head)
{
 link_s p = head;
 while(p->next != head)
 //如果链表指向的下一个节点为头结点,则跳出循环
 { 
     p=p->next;//跳向下一个节点

  printf("data=%d\n",p->data);

  //printf("hahha\n");

 }
}

link_s reverse(link_s head)
{
 link_s p = head->next;//结构体p指向头结点的下一个
 link_s nex = head->next;//用于暂时保存头结点指向的下一个结构体
 link_s rev = head;//用于暂时保存头结点

 while(p->next !=head)//未改变指向以前的指针,用于判断循环
 {
  p=p->next;//移动结点位置
  nex->next = rev;//将头结点的下一个点指向头结点
  rev = nex;//将头结点指向的结点赋值给,保存头结点的结点
  nex = p;//利用赋值运算来使结点后移
 }
   
   
 head->next = nex;//将头结点指向尾结点
 nex ->next = rev;//尾结点指向尾结点前一个点

 return head;//返回头结点
 
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值