双向链表的快速排序函数

doubleLink.h

#ifndef __doubleLink__
#define __doubleLink__

#include<stdio.h>//输入输出头文件
#include<stdlib.h>//堆空间引用
typedef int DataTape;//对int重定义

#endif

typedef struct node//创建结构体
{
		union//
		{
			struct node* tail;
			DataTape data;
		};
		struct node *next;
		struct node *prior;
}doubleLink,*doubleLinkPtr;//
//
doubleLinkPtr create();
//
doubleLinkPtr node_create(DataTape a);
//
int empt(doubleLinkPtr h);
//
void tail_add(doubleLinkPtr h,DataTape a);
//
void show(doubleLinkPtr h);
//
doubleLinkPtr part(doubleLinkPtr lift,doubleLinkPtr right);

void sort(doubleLinkPtr lift,doubleLinkPtr right);
//
void My_free(doubleLinkPtr h);

doubleLlink.c

#include"doubleLink.h"

doubleLinkPtr create()//创建链表
{
	doubleLinkPtr h=(doubleLinkPtr)malloc(sizeof(doubleLink));
	if(NULL==h)
	{
		printf("创建失败\n");
		return NULL;
	}
	h->next=NULL;
	h->prior=NULL;
	h->tail=NULL;
	printf("创建成功\n");
	return h;
}

doubleLinkPtr node_create(DataTape a)//创建子节点
{
	doubleLinkPtr p=(doubleLinkPtr)malloc(sizeof(doubleLink));
	if(NULL==p)
	{
		printf("创建失败");
		return NULL;
	}
	p->data=a;
	p->next=NULL;
	p->prior=NULL;
	return p;

}

int empt(doubleLinkPtr h)//判空
{
	if(NULL==h)
	{
		printf("判空失败\n");
		return 0;
	}
	return h->tail==NULL;
}

void tail_add(doubleLinkPtr h,DataTape a)
{
	if(NULL==h)
	{
		printf("插入失败\n");
		return ;
	}
	doubleLinkPtr p=node_create(a);
	doubleLinkPtr p1=h;
	while(p1->next!=NULL)
	{
		p1=p1->next;
	}
	p1->next=p;
	p->next=NULL;
	p->prior=p1;

	h->tail=p;
	return ;
}

doubleLinkPtr part(doubleLinkPtr lift,doubleLinkPtr right)
{
	doubleLinkPtr head=lift;
	doubleLinkPtr tail=right;
	int x=lift->data;
	while(head!=tail)
	{
		while(tail->data>=x && head!=tail)
		{
			tail=tail->prior;
		}
		head->data=tail->data;
		while(head->data<=x && head!=tail)
		{
			head=head->next;
		}
		tail->data=head->data;
	}
	head->data=x;
	return head;
}

void sort(doubleLinkPtr lift,doubleLinkPtr tail)
{
	doubleLinkPtr l=lift;
	doubleLinkPtr r=tail;
	if(l==r)
	{
		return;
	}
	doubleLinkPtr mid=part(l,r);
	sort(l,mid->prior);
	sort(mid->next,r);
}

void show(doubleLinkPtr h)//遍历打印
{
	if(NULL==h||empt(h))
	{
		printf("输出失败\n");
		return ;
	}
	doubleLinkPtr p=h;
	while (p->next!=NULL)
	{
		p=p->next;
		printf("%d->",p->data);
	}
	return ;
}

void My_free(doubleLinkPtr h)//销毁
{
	if(NULL==h)
	{
		printf("销毁失败\n");
		return ;
	}
	doubleLinkPtr p=h->next;
	while(p->next!=NULL)
	{
		doubleLinkPtr p1=p;
		h->next=p->next;
		p->next->prior=h;
		free(p1);
		p1=NULL;
		p=p->next;
	}
	printf("销毁成功\n");
	return ;
}

maindoubleLink.c

#include"doubleLink.h"
int main()
{
	doubleLinkPtr h=create();

	tail_add(h,3);	
	tail_add(h,1);	
	tail_add(h,9);	
	tail_add(h,6);	
	tail_add(h,8);	
	tail_add(h,7);	

	show(h);

	sort(h->next,h->tail);
	show(h);
	
	My_free(h);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值