【问题标题】:How to access an array in all functions in my C program?如何在我的 C 程序中访问所有函数中的数组?
【发布时间】:2018-04-25 06:54:40
【问题描述】:

我正在尝试为竞争性编码问题创建一个分段树,并且该树使用数组表示。我有函数 rangeMinQuery 和 updateTree 在数组上执行中间作业。我无法弄清楚如何使用这些函数来操作所述数组。

#include <stdio.h>
#include <stdlib.h>
#define bool int    
#define MAX(a,b) (((a)>(b))?(a):(b))

int upper_power_of_two(int v)
{
v--;
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
v++;
return v;

}

int getMid(int s, int e)
{
  return s + (e -s)/2;  
}

void updateValueUtil(int segTree[], int ss, int se, int i, int diff, int si)
{
// Base Case: If the input index lies outside the range of 
// this segment
if (i < ss || i > se)
    return;

// If the input index is in range of this node, then update 
// the value of the node and its children
st[si] = st[si] + diff;
if (se != ss)
{
    int mid = getMid(ss, se);
    updateValueUtil(st, ss, mid, i, diff, 2*si + 1);
    updateValueUtil(st, mid+1, se, i, diff, 2*si + 2);
}
}

void updateValue(int arr[], int segTree[], int n, int i, int new_val)
{
// Get the difference between new value and old value
int diff = new_val - arr[i];

// Update the value in array
arr[i] = new_val;

// Update the values of nodes in segment tree
updateValueUtil(st, 0, n-1, i, diff, 0);
}

int rangeMinquery(int segTree[],int qlow,int qhigh,int low,int high,int pos)
{
if(qlow<=low && qhigh >=high)
    return segTree[pos];

if(qlow>high || qhigh <low)
        return 9999999999;
int mid=(low+high)/2;
return MAX(rangeMinquery(segTree,qlow,qhigh,low,mid,2*pos+1),rangeMinquery(segTree,qlow,qhigh,mid+1,high,2*pos+2));
}

int main()
{
int n,q,x,l,r,i;
scanf("%d %d %d %d",&n,&q,&l,&r);
int a[n];
int segTree[upper_power_of_two(n)];
printf("%d\n",upper_power_of_two(n));
while(q--)
{
    int cmd,pos1,pos2;
    scanf("%d %d %d",&cmd,&pos1,&pos2);
    if(cmd==1)
    {
        a[pos1]+=pos2;
        updateValue(a,segTree,n,1,0);
    }
    if(cmd==2)
    {
        x=rangeMinquery(segTree,pos1,pos2,0,n,0);
        printf("%d\n",x);
    }
}
return 0;
}    

如您所见,我正在尝试操作数组 segTree 并保留其中的值。我也想知道是否有一种方法可以在 JAVA 上实现相同的功能?

【问题讨论】:

  • C have a bool type, #include &lt;stdbool.h&gt; 并用它代替你的宏。
  • 哦,谢谢。我会这样做的:)
  • return MAX(rangeMinquery(segTree,... 会导致大量函数调用...
  • 这就是算法的工作原理……无论如何;那不是我要找的。我想知道如何访问操作这个数组,使其对所有函数都是全局的。
  • 您需要将 segtree 数组作为通过引用传递给您的函数调用。 check here how

标签: c arrays tree segment-tree


【解决方案1】:

你可以制作全局指针...

//in global scope
int *segTree;

... 并使用malloc() 运算符创建数组:

//in main()
segTree = malloc(upper_power_of_two(n) * sizeof(int));

现在你的数组是全局的。但请记住在结束程序之前free(segTree)

顺便说一句。您应该永远不要像在给定代码中那样创建具有可变大小的本地数组(在堆栈上)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2016-10-23
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多