C实现的循环链表排序

/**************************************loop link***********************************/
/**********************************author:zhangyong*******************************/
/***********************************language:C************************************/


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

typedef struct _link
{
    int data;
	struct _link *rlink,*link;

}link;

int Data[8]={23,20,78,56,47,100,456,9};// 45 23 78 56 47 100 456 9

link* creatlink() //创建链表
{
	link *h,*node,*newnode;
	int i;
	h=node= (link*)malloc(sizeof(link));
    node->data = Data[0];
	node->rlink = NULL;
	node->link = NULL;
	for( i=1;i<8;i++)
	{
		newnode = (link*)malloc(sizeof(link));
		node->rlink = newnode;
		newnode->link = node;
		
		newnode->data = Data[i];
		node = newnode;
		

	}
	newnode->rlink = h;
	h->link = newnode;
	return h;
}

void dele(int data,link* head)//删除data结点
{
	int i;
	if(data == Data[0])
	{
		head->link->rlink = head->rlink;
		head->rlink->link = head->link;
		free(head);
	}
	for(i=1;i<8;i++)
	{
		head =head->rlink;
		if(data == Data[i])
		{
			
			head->link->rlink = head->rlink;
			head->rlink->link = head->link;
			free(head);
			break;
		}
	
	}
}


link* add(int data,link *head)  //在头部添加节点
{
	link *p;
	p = (link*)malloc(sizeof(link));
	p->data= data;
	p->rlink = head;
	p->link = head->link;
	head->link->rlink = p;
	head->link = p;
	return p;
}

link * sort(link* head)  //对循环链表的数据进行排序 使用冒泡排序
{
    link *q,*p,*t,*s;//*n;
	int i,j,k;
    q = head;
	for(j=0;j<8;j++)
	{
		p = q->rlink;
		for(i=0;i<7-j;i++)  //每次冒泡把一个最大值放到最后
		{
			
			if(p->data<q->data)
			{
				t = q;
				s = p;
				t->link->rlink = p;
				p->link = t->link;
				s->rlink->link = q;
				q->rlink = s ->rlink ;
				p->rlink = q;
				q->link = p;
				//s->rlink->link = q;
			//	q->rlink = s ->rlink ;
				//n = q;	
				//head = p;
				p = p->rlink ->rlink ;
			}
			else
			{
			/*	if(j==7)
				{
					head = q;
					goto  HERE;
				}*/
				q=q->rlink;
				p= p->rlink;
			}
				
		}
		       if(j==7)
				{
					head = q;
					goto  HERE;
				}
		for(k=0;k<=j;k++)
			q= q->rlink ;
	}
	//head = p;
HERE:
	return head;  //返回最小值为头结点
}

void print(link* head) //打印链表
{
	int i;
	for(i=0;i<8;i++)
	{
		printf("%d\t",head->data);
		head = head->rlink;
	}
}

void clear(link* head)  //释放分配的内存
{
	int i;
	link* q;
	for(i=0;i<8;i++)
	{
		q = head->rlink;
		free(head);
		head =q;
	}
}

int main()
{
	link* head=NULL;
	//head = (link*)malloc(sizeof(link));
	head = creatlink();
	dele(20,head);
	head = add(45,head);
	head = sort(head);
	print(head);
	clear(head);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值