C语言数据结构堆的基本操作实现_第1页
C语言数据结构堆的基本操作实现_第2页
C语言数据结构堆的基本操作实现_第3页
C语言数据结构堆的基本操作实现_第4页
C语言数据结构堆的基本操作实现_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第C语言数据结构堆的基本操作实现目录1.基本函数实现a.代码1(向下调整)b.代码2(向上调整)c.代码3(交换)2.建堆

3.插入数据4.删除数据5.获取堆顶的数据6.堆的数据个数7.判空8.打印9.销毁10.测试11.测试结果12.用堆排序(降序)

1.基本函数实现

a.代码1(向下调整)

voidAdjustDown(DateType*a,intn,intparent)

intchild=parent*2+1;

while(childn)

if((child+1)na[child]a[child+1])

++child;

if(a[parent]a[child])

Swap(a[parent],a[child]);

parent=child;

child=parent*2+1;

else

break;

}

注意:if里面的条件语句(child

+1)n是防止越界的,因为不能保证有右孩子。

b.代码2(向上调整)

voidAdjustUp(DateType*a,intchild)

intparent=(child-1)/2;

while(child0)

if(a[child]a[parent])

Swap(a[child],a[parent]);

child=parent;

parent=(child-1)/2;

else

break;

}

注意:while里面的条件语句是不能够写成(parent0),因为当child==0时,parent=(child-1)/2,parent==0,再次进入循环不满足a[child]a[parent],恰好跳出循环。如果写成(a[child]=a[parent])就死循环了

c.代码3(交换)

voidSwap(DateType*p1,DateType*p2)

DateTypetmp=*p1;

*p1=*p2;

*p2=tmp;

}

2.建堆

voidCreatHeap(Heap*p,DateType*num,intn)

assert(p);

p-a=(DateType*)malloc(n*sizeof(DateType));

if(p-a==NULL)

printf("mallocfailed\n");

exit(-1);

memcpy(p-a,num,n*sizeof(DateType));

p-size=n;

p-capacity=n;

//建小堆

for(inti=(n-1-1)/2;ii--)

AdjustDown(p-a,p-size,i);

}

3.插入数据

voidHeapPush(Heap*p,DateTypex)

assert(p);

if(p-size==p-capacity)

DateType*tmp=(DateType*)realloc(p-a,(p-capacity)*2*sizeof(DateType));

if(tmp==NULL)

printf("reallocfailed\n");

exit(-1);

(p-capacity)*=2;

p-a[p-size]=x;

++(p-size);

//向上调整

AdjustUp(p-a,p-size-1);

}

4.删除数据

voidHeapPop(Heap*p,DateTypex)

assert(p);

Swap(p-a[0],p-a[p-size-1]);

--(p-size);

AdjustDown(p-a,p-size,0);

//左右子树还是小堆,直接调整行了

}

把堆顶的数据与最后一个数据交换,再次调整size-1个数据。

5.获取堆顶的数据

DateTypeHeapTop(Heap*p)

assert(p);

returnp-a[0];

}

6.堆的数据个数

intHeapSize(Heap*p)

assert(p);

returnp-size;

}

7.判空

boolHeapIsEmpty(Heap*p)

assert(p);

returnp-size==0;

}

8.打印

voidPrint(Heap*p)

assert(p);

for(inti=0;ip-size;i++)

printf("%d",(p-a)[i]);

printf("\n");

intcount=0;//计数

intlevelsize=1;

for(inti=0;ip-size;i++)

printf("%d",p-a[i]);

++count;

if(count==levelsize)

printf("\n");

levelsize*=2;

count=0;//重新计数

printf("\n");

}

9.销毁

voidHeapDestory(Heap*p)

assert(p);

free(p-

p-a=NULL;

p-capacity=p-size=0;

}

10.测试

intmain()

intnum[]={12,15,17,23,10,25};

intn=sizeof(num)/sizeof(num[0]);

Heapa;

//创建小堆

CreatHeap(a,num,n);

Print(

printf("\n");

//插入数据

HeapPush(a,1);

Print(

//删除对顶的数据

HeapPop(

Print(

printf("\n");

//获取堆顶数据

intret=HeapTop(

printf("Thetopdateis%d\n",ret);

//堆的数据个数

intnumber=HeapSize(

printf("Thenumberofheapis%d\n",number);

//销毁

HeapDestory(

return0;

}

11.测试结果

12.用堆排序(降序)

a.代码1

intmain()

DateTypenum[]={12,1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论