/*
* FindSecondElement.c
*
* Created on: 2011-10-13
* Author: kontrol
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 1000
struct Node
{
int data;
struct Node * lchild;
struct Node * rchild;
_Bool tag;
};
int upper(int n, int div) //求上整数
{
float r = (float)n/div;
if(r == n/div)
return r;
else return n/div + 1;
}
void findSecondElement(int a[], int length)
{
struct Node* elements = (struct Node*)malloc(length * sizeof(struct Node));
memset((void *)elements, 0 , length * sizeof(struct Node));
int j = 0;
while(j<length)
{
elements[j].data = a[j];
j++;
}
struct Node * p = elements;
int count = length;
while(count > 0) //退出循环的条件比较难写
{
if(count == 1) break;
int i = 0;
struct Node* upperLayer = (struct Node *)malloc(upper(count, 2) * sizeof(struct Node));
while(i+1<count)
{
if(p[i].data < p[i+1].data)
{
upperLayer[i/2].data = p[i].data;
upperLayer[i/2].lchild = p + i;
upperLayer[i/2].rchild = p+ i +1;
upperLayer[i/2].tag = 1;
}
else
{
upperLayer[i/2].data = p[i+1].data;
upperLayer[i/2].rchild = p + i + 1;
upperLayer[i/2].lchild = p + i;
upperLayer[i/2].tag = 0;
}
i += 2;
}
if(i+1 == count)//说明原来那一层是基数个元素
{
upperLayer[upper(count, 2)-1].data = p[i].data;
upperLayer[upper(count, 2)-1].lchild = p + i;
upperLayer[upper(count, 2)-1].rchild = 0;
upperLayer[upper(count, 2)-1].tag = 1;
}
p = upperLayer;
count = upper(count, 2);
}
printf("the minumin element is %d\n", p->data);
printf("the second minumin element is: ");
int secondMin = 0;
if (p->tag)
{
secondMin = p->rchild->data;
p = p->lchild;
}
else
{
secondMin = p->lchild->data;
p = p->rchild;
}
while(p->rchild && p->lchild)
{
if (p->tag)
{
if(p->rchild->data < secondMin )
secondMin = p->rchild->data;
p = p->lchild;
}
else
{
if(p->lchild->data < secondMin )
secondMin = p->lchild->data;
p = p->rchild;
}
}
printf("%d", secondMin);
}
int main()
{
puts("please input the scale of data:");
int length = 0;
scanf("%d", &length);
int* a = (int *)malloc(length * sizeof(int));
srand(time(0));
int i=0;
puts("the array is:");
for(;i<length;i++)
{
a[i] = rand()%MAX;
printf("%d ", a[i]);
}
printf("\n");
findSecondElement(a, length);
return 0;
}
所出现的问题:
1:退出大循环的时候,由于count = upper(count, 2),所以当count=1的时候就会有count一直等于1;这样就不能退出循环了。
2:最后寻找第二小的元素的时候,搞的乱七八糟的,因为自己老是不能知道退出循环的条件,开始些的是while(p),这样的话p->lchild和p->rchild会指向空指针,导致错误,因此一直没有调试对!
3:如果程序段不长的话,我想还是最好重新写一下,这样比盲目的调试更有效!