C语言中二进制搜索树中的计时器实现

时间:2018-12-01 10:00:14

标签: c algorithm

我一直在编写一个程序,该程序应该确定该过程花费了多长时间,但是它失败了,并且始终返回0.0000秒的值。

#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#include <time.h>

struct node
{
        int data;
        struct node *left;
        struct node *right;
};
struct node *tree;
struct node *InsertElement(struct node *, int); //declaration//
struct node *findLargestElement(struct node *);
void create_tree(struct node *);

void create_tree(struct node *tree)
{
        tree=NULL;  //resets the tree//
}

struct node *findLargestElement(struct node *tree)
{
    if((tree==NULL)|| (tree->right==NULL))
        return tree;
    else
        return findLargestElement(tree->right);
}

   struct node *InsertElement(struct node *tree, int val)
{
    struct node *ptr, *nodeptr, *parentptr;
    ptr = (struct node*)malloc(sizeof(struct node)); //memory allocation//
    ptr->data = val;
    ptr->left = NULL;
    ptr->right = NULL;
    if(tree==NULL) //for root node//
    {
        tree=ptr;
        tree->left=NULL;
        tree->right=NULL;
    }
    else
    {
        parentptr=NULL;
        nodeptr=tree;
        while(nodeptr!=NULL)
        {
        parentptr=nodeptr;
        if(val<nodeptr->data)
        nodeptr=nodeptr->left; //if value is less than root go left//
        else
        nodeptr = nodeptr->right;//if more go right//
        }
        if(val<parentptr->data)//if less than parent go left//
        parentptr->left = ptr;
        else
        parentptr->right = ptr;
    }
    return tree;
}

int main()
{
    int option, val;
    struct node *ptr;
    clock_t begin, end;
    create_tree(tree);

         do
    {
        printf("\n\n\n\t\t*****Main Menu****\n\n");
        printf("\t\t 1. Add new nodes: \n");
        printf("\t\t 2. Find the largest element\n");
        printf("\t\t 11. Exit\n");
        printf("Enter your option : ");
        scanf("%d", &option);

        switch(option)
        {
            case 1:   printf("\nEnter the value of the new node:");
                        scanf("%d", &val);
                        tree= InsertElement(tree,val);
                        break;

            case 2:     begin=clock();  //timer begin//
                        ptr = findLargestElement(tree);
                        end=clock();   //timer ends//
                        double time_spent=(double)(end-begin)/CLOCKS_PER_SEC; //time elapsed//
                        printf("\nThe largest element is:%d\n", ptr->data);
                        printf("The  time taken is %f  end time is", time_spent);
                        break;

        }
    }while(option!=11);

    return 0;
}

这是程序的一部分,该程序将在二进制搜索树中找到最大值。 (编辑:我添加了其他代码来进行澄清。该程序将让用户输入树的节点,然后相应地重新排列节点,理论上节点数没有限制。我的主要问题还是我的实现计时器是否正确?还是还有其他方法?)  这只是我编写的代码的一部分,我想知道是否有其他方法可以替代过程花费的时间,或者我是否编码错误。我希望所花费的时间是经过的时间。这种方法仅适用于循环吗?

我尝试过类似的事情

begin=clock();
ptr = findLargestElement(tree);
end=clock();
printf("The  start time %f and the end time is %f", begin,end)

它返回的开始时间为0,并且结束时间为大数,但是将其转换为秒似乎对我不起作用。

(其他信息:我已经阅读了time.h文档,并且似乎clock()应该可以工作,我一直在尝试在StackOverflow上提到的其他方法,但是它们似乎都不起作用。是因为我使用了而是一个结构?) 谢谢

2 个答案:

答案 0 :(得分:0)

类型clock_t不一定是double,它可以是整数类型。

一种方法是

double begin = ((double )clock()) / CLOCKS_PER_SEC;
ptr = findLargestElement(tree);
double end = ((double )clock()) / CLOCKS_PER_SEC;
printf("The time taken is %f\n", end - begin);

请注意,在clock()是整数类型的情况下,clock_t将在除法之前转换为double值以保留信息。

答案 1 :(得分:0)

搜索并进行了大量反复试验后,我可以得出结论,所花费的时间太快了,无法测量。在测试阶段,我最多只有50个节点。

通过引用此网站https://aaronjwood.com/articles/binary-search-trees/,我调整了代码,获得有效遍历时间所需的最小节点数为1,000,000个节点。

因此结论是,要解决C中的这一问题,我们将不得不使用大量节点。