2016-04-30 12 views
-1

Ich würde eine Funktion schreiben, die eine Struktur ausarbeitet und die Länge eines Array von Zeichen zurückgibt, das in derselben Struktur rekursiv definiert ist. Die struct ist:Wie Zugriff mit Rekursion auf ein Element einer Struktur

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

Daten, das Feld von Zeichen, nur zwei Arten von Charakter hat: ‚0‘ und ‚1‘, während die Dimension die Länge des Arrays, aber nicht mit der Sequenz von ‚0 ' und 1'. Also versuche ich, diese Funktion zu schreiben:

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; 
} 

aber ich habe may Zweifel. Zuerst durch den Compiler verursacht, der sagt:

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) { 

Wie kann ich auf den Daten arbeiten, wenn ich musste meine Funktion * bin_seq die Binseq passieren? Ich weiß, dass mein Code dafür falsch ist, aber wenn ich das Gewicht berechnen möchte, musste ich die Variable i erhöhen, aber das wird nicht, denke ich, zunehmen. Wie kann ich daran arbeiten?

+0

Sie * nicht definiertes Verhalten aufgerufen * durch einen Wert von nicht initialisierten Variable mit automatischer Speicherdauer 'I', Das ist unbestimmt. – MikeCAT

+2

Entschuldigung, aber ich konnte nicht klar, was Sie wollen. 'BinSeq' scheint keine Zeiger zum nächsten Knoten zu haben. – MikeCAT

+0

@MikeCat Wie kann ich an den Array-Daten arbeiten, wenn ich an meine Funktion bin_seq übergeben werden muss, die vom Typ BinSeq ist? –

Antwort

0

wie folgt aus:

#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; 
} 

durch die Hilfs-rekursive Funktion

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

Eine solche Rekursion ist sehr verschwenderisch. – BLUEPIXY

+0

Also zuerst muss ich daran denken, dass ich mit einem Zeiger vom Typ Binseq arbeite, den ich erstellt habe. Um dann in binseq "einzutreten", musste ich das Sintax verwenden, das Sie dort benutzt haben? & (BinSeq) {bin_seq-> Daten + 1, bin_seq-> Dimension}? Oder kann ich das anders machen? –

+0

@MicheleColuccelli Sie können lokale Variable statt '& (BinSeq) {bin_seq-> Daten + 1, bin_seq-> Dimension}' verwenden. ZB "BinSeq temp; temp.data = bin_seq-> Daten + 1; temp.dimension = bin_seq-> dimension; '...' return 1 + length (&temp); ' – BLUEPIXY

0

Wenn interpretiert ich diesen Code sollte richtig, tun, was Sie wollen:

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; 
    } 
} 

Obwohl es effizientere Möglichkeiten, dies zu codieren: Sie können einfach Zeigerarithmetik zu Schleife über die char Array in der Praxis, bis Sie verwenden finde alles außer 0 oder 1. Du hast auch nicht gezeigt, wie du die Sequenz initialisierst; man würde annehmen, dass dies mit einem bekannten Terminatorzeichen (z. B. \0) korrekt durchgeführt wird.

+0

Ich musste diese Funktion schreiben: int length (BinSeq * bin_seq), mit diesem Prototipo. Wahrscheinlich musste ich meine Frage neu formulieren, ist unklar. –

+0

danke für Ihre Unterstützung –

0

Ich musste eine Funktion int Länge (BinSeq * bin_seq) schreiben, die rekursiv die Länge der Binärsequenz bin_seq berechnet. Die Struktur ist:

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

und die wichtigsten ist:

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

Wie kann ich die Länge der Daten berechnen, ob ich bin_seq passieren musste funktionieren?

+0

Sie sollten Ihre Frage bearbeiten, anstatt eine andere Frage in einer "Antwort" zu stellen, hauptsächlich weil es schwierig für jemand anderen sein würde, der Konversation zu folgen. Ich werde meine Antwort bearbeiten, um diese Klärung anzugehen. – Cyb3rFly3r

Verwandte Themen