1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
| #include <stdlib.h> #include <stdio.h> #include <stdbool.h>
#define MAXDATA 1000 #define ERROR -1;
typedef int ElementType;; typedef struct HeapStruct *MaxHeap; struct HeapStruct { ElementType *Elements; int Size; int Capacity; };
bool IsEmpty(MaxHeap H);
bool IsFull(MaxHeap H);
MaxHeap Create(int MaxSize) { MaxHeap H = (MaxHeap) malloc(sizeof(struct HeapStruct)); H->Elements = (ElementType) malloc(sizeof(ElementType) * MaxSize); H->Size = 0; H->Capacity = MaxSize; H->Elements[0] = MAXDATA; return H; }
bool IsEmpty(MaxHeap H) { return H->Size == 0; }
bool IsFull(MaxHeap H) { return H->Size == H->Capacity; }
void Insert(MaxHeap H, ElementType item) { int i; if (IsFull(H)) { printf("最大堆已满"); return; } i = ++H->Size; for (; H->Elements[i / 2] < item; i /= 2) { H->Elements[i] = H->Elements[i / 2]; } H->Elements[i] = item; }
ElementType DeleteMax(MaxHeap H) { ElementType MaxItem, Temp; int Parent, Child; if (IsEmpty(H)) { printf("最大堆为空"); return ERROR; } MaxItem = H->Elements[1]; Temp = H->Elements[H->Size--]; for (Parent = 1; Parent * 2 < H->Size; Parent = Child) { Child = Parent * 2; if (Child != H->Size && (H->Elements[Child] < H->Elements[Child + 1])) { Child++; } if (Temp > H->Elements[Child]) break; else H->Elements[Parent] = H->Elements[Child]; } H->Elements[Parent] = Temp; return MaxItem; }
void PercDown(MaxHeap H, int P) { int Parent, Child; ElementType X; X = H->Elements[P]; for (Parent = P; Parent * 2 <= H->Size; Parent = Child) { Child = Parent * 2; if (Child != H->Size && (H->Elements[Child] < H->Elements[Child + 1])) Child++; if (X >= H->Elements[Child]) break; else H->Elements[Parent] = H->Elements[Child]; } H->Elements[Parent] = X; }
void BuildHeap(MaxHeap H) { int i; for (i = H->Size / 2; i > 0; i--) { PercDown(H, i); } }
int main() { int maxNum, i; ElementType value; printf("please input the heap numbers:\n"); scanf("%d", &maxNum); MaxHeap Heap = Create(maxNum); printf("please input %d numbers:\n", maxNum); for (i = 0; i < maxNum; i++) { scanf("%d", &value); Insert(Heap, value); } printf("The root value is: %d\n", Heap->Elements[1]);
BuildHeap(Heap); printf("after delete, the value is: %d\n", Heap->Elements[1]); return 0; }
|