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;
}