2016-04-30 74 views
-1

我会写一个函数,该函数详细说明一个结构,并以递归方式返回在同一个结构中定义的字符数组的长度。 的结构是:如何用递归访问结构的某个元素

typedef struct BinSeq { 
char* data;    
int dimension;   
}BinSeq 

数据,字符阵列,可仅具有两个字符类型:“0”和“1”,而尺寸是阵列的长度,但不是“0序列'和'1'。 所以我尝试写这样的功能:

int length(BinSeq* bin_seq) { 
    int i; 
    if(bin_seq->data[i] == '0' || bin_seq->data[i] == '1') 
    { 
     i++; 
     return 1 + length(bin_seq->data[i]); 
    }else 
      return 0; 
} 

,但我对此表示怀疑五月。首先由说,编译器造成的:

warning: passing argument 1 of ‘length’ makes pointer from integer without a cast [enabled by default] 
       return 1 + length(bin_seq->data[i]); 
      ^
recursion.c:13:6: note: expected ‘struct BinSeq *’ but argument is of type ‘char’ 
    int length(BinSeq* bin_seq) { 

我怎么能对数据进行工作,如果我要传递给我的功能Binseq * bin_seq?我知道我的代码出错了,但如果我想计算这个密码,我不得不增加变量i,但是我认为它不会增加。我该如何解决这个问题?

+0

通过使用具有自动存储持续时间'i'未初始化的变量的值调用*未定义行为*,这是不确定的。 – MikeCAT

+2

对不起,但我没有明确得到你想要的。 'BinSeq'似乎没有像指向下一个节点的东西。 – MikeCAT

+0

@MikeCat如果我必须传递给我的函数bin_seq,它是BinSeq类型,我该如何处理数组数据? –

回答

0

这样的:

#include <stdio.h> 

typedef struct BinSeq { 
    char *data; 
    int dimension; 
} BinSeq; 

int length(BinSeq* bin_seq) { 
    if(*bin_seq->data == '0' || *bin_seq->data == '1') 
     return 1 + length(&(BinSeq){bin_seq->data + 1, bin_seq->dimension}); 

    return 0; 
} 

int main(int argc, char** argv) { 
    BinSeq binary; 

    binary.data = "0000110111"; 
    binary.dimension = 2014; 

    int dimension_of_array = length(&binary); 

    printf("%d\n", dimension_of_array); 

    return 0; 
} 

利用辅助递归函数

int aux_length(const char *data){ 
    if(*data == '0' || *data == '1') 
     return 1 + aux_length(data + 1); 

    return 0; 
} 

int length(BinSeq* bin_seq) { 
    return aux_length(bin_seq->data); 
} 
+0

这样的递归非常浪费。 – BLUEPIXY

+0

因此,首先我必须记住,我正在使用由我创建的Binseq类型的指针。然后在binseq中“输入”,我必须使用您在那里使用的Sintax? &(BinSeq){bin_seq-> data + 1,bin_seq-> dimension}?或者我能否以其他方式做到这一点? –

+0

@MicheleColuccelli你可以使用局部变量而不是'&(BinSeq){bin_seq-> data + 1,bin_seq-> dimension}'。例如'BinSeq temp; temp.data = bin_seq-> data + 1; temp.dimension = bin_seq-> dimension;'...'return 1 + length(&temp);' – BLUEPIXY

0

如果我理解正确的话,这个代码应该做你想要什么:

int length(BinSeq* bin_seq, int i) { 
    if(bin_seq->data[i] == '0' || bin_seq->data[i] == '1') 
    { 
     return 1 + length(bin_seq->data, ++i); 
    } else { 
     return 0; 
    } 
} 

虽然有更有效的方式实现代码:实际上,你可以简单地使用指针运算来遍历所有的char阵列,直到你找到除0或1之外的任何内容。您还没有显示如何初始化序列;人们会认为它是用一个已知的终止字符正确完成的(例如\0)。

+0

我不得不写这个函数:int lenght(BinSeq * bin_seq),用这个prototipo。可能我不得不重新提出我的问题,目前还不清楚。 –

+0

感谢您的支持 –

0

我不得不写一个递归计算二进制序列bin_seq长度的函数int length(BinSeq * bin_seq)。该结构是:

typedef struct BinSeq { 
char* data;    
int dimension;   
}BinSeq 

和主要是:

int main(int argc, char** argv) { 
     Binseq* binary; 
     binary.data = "0000110111"; 
     binary.dimension = 2014; 
     int dimension_of_array = length(BinSeq* bin_seq); 
    } 

我如何计算数据长度,如果我必须通过bin_seq发挥作用?

+0

您应该编辑您的问题,而不是在“答案”中提出另一个问题,主要是因为其他人难以跟踪对话。我将编辑我的答案以解决此问题。 – Cyb3rFly3r