建立一个单向的循环链表,随机输入,经过排序,从小到大输出,
并在最后逆向输出(逆向输出的方式为让单向链表指向反向)
#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;//返回头结点
}