| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 745 人关注过本帖
标题:堆的实现,只包含建立插入和删除两个操作
只看楼主 加入收藏
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
结帖率:59.52%
收藏
 问题点数:0 回复次数:3 
堆的实现,只包含建立插入和删除两个操作
#include"stdio.h"
#include <stdlib.h>
#include"string.h"
typedef struct dui
{
    int size;
    int maxsize;
    int *elem;
}dui;

dui *creat(int maxsize)
{
    dui *p;
    p=(dui*)malloc(sizeof(dui));
    if(p==NULL)
    {
        printf("分配内存出错");
        return NULL;
    }
    else
    {
        if(p==NULL)
        {
        printf("分配内存出错");
        return NULL;
        }
        else
        {
            p->elem=(int*)malloc((maxsize+1)*sizeof(int));
            p->maxsize=maxsize;
            p->size=0;
            p->elem[0]=0;
        }
        return p;
    }
}
int ax(int a,int b)  /*比较数的大小*/
{
    if(a>b)
        return a;
    else
        return b;
}



void insert(dui *p,int x)
{
    int b=(p->size+1)/2;
    int a,c;
    a=p->size+1;
    if(p->size>p->maxsize)
        printf("堆已经满了");
    else
    {
        while(p->elem[b]>x)
        {
            p->elem[a]=p->elem[b];
            a=b;
            b=b/2;
        }
        p->elem[a]=x;   
    }
    p->size++;
}


void delmin(dui *p)
{
    int i=1;
    int b,c;
    while(2*i<=p->size)
    {
        c=-1;
        if(2*i==p->size)
        {
            p->elem[i]=p->elem[2*i];
            i=2*i;
            c=0;
        }
        else
        {
            if(p->elem[2*i]<p->elem[2*i+1])
            {
            p->elem[i]=p->elem[2*i];
            i=2*i;
            c=1;
            }
            else
            {
            p->elem[i]=p->elem[2*i+1];
            i=2*i+1;
            c=2;
            }
        }
    }
    if(c!=1)
    {
        if(p->elem[i]>p->elem[p->size])
            p->elem[i/2]=p->elem[p->size];
        else
            p->elem[i]=p->elem[p->size];
    }
    p->size--;
}

void dayin(dui *p)
{
    int i;
    for(i=1;i<=p->size;i++)
        printf("%d\n",p->elem[i]);
}


main()
{
    int i,j;
    dui *p;
    printf("请输入堆的大小:\n");
    scanf("%d",&j);
    p=creat(j);
    printf("请输入堆的数据:\n");
    scanf("%d",&i);
    while(i!=0)
    {
        insert(p,i);
        printf("请输入堆的数据:\n");
        scanf("%d",&i);
    }
    delmin(p);
    dayin(p);
   
   
  
}

[ 本帖最后由 zhu224039 于 2012-8-7 02:37 编辑 ]
搜索更多相关主题的帖子: return include max 内存 
2012-08-07 00:02
aa59710014
Rank: 1
等 级:新手上路
帖 子:57
专家分:6
注 册:2012-8-30
收藏
得分:0 
232

为热爱而坚持!
2012-08-31 10:47
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
送给伸手党

我要成为嘿嘿的黑客,替天行道
2012-09-17 18:26
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
shang

我要成为嘿嘿的黑客,替天行道
2012-11-21 07:11
快速回复:堆的实现,只包含建立插入和删除两个操作
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011646 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved