以递归方式在结构数组中打印数据

时间:2016-12-09 22:04:45

标签: c arrays pointers recursion struct

我需要以递归方式打印结构数组中的数据,

index, numberOfChildern, child[0]...child[numberOfChildern-1] 

对于每个孩子,我都需要打印index, numberOfChildern, child[0]...child[numberOfChildern-1]

typedef struct node point;
typedef point **pointsList;

结构:

struct node{
  int index; //the order in the instance file
  int x;//x coord
  int y;//y coord
  int parent;//parent in tree when added
  int numChildern;//has val 0 -- 8 maybe, but doesn't matter the way I wrote it
  int *child;    
};

每个结构中的所有值都设置正确,这是我开始编写以完成任务的不完整方法。

void printStringOfChildern(pointsList list, point *point, int fileNum){


if(point->numChildern == 0)
    return;

  //print the index
  char index[calcNumberOfDigitsInAInt(point->index)+3];
  sprintf(index, "%d", point->index);
  strcat(index, ", ");
  print(index, fileNum);

  //print the number of childern
  char chidern[calcNumberOfDigitsInAInt(point->numChildern)+3];
  sprintf(chidern, "%d", point->numChildern);
  strcat(chidern, ", ");
  print(chidern, fileNum);

  //print the childern
  for(int i=0; i<point->numChildern; i++){
    char child[calcNumberOfDigitsInAInt(point->child[i])+3];

//was child[i] now point->child[i]
    sprintf(child, "%d", point->child[i]);
    strcat(child, ", ");
    print(child, fileNum);

    //print out other childern and their data if there is any
    int numChildern = numberOfChildern(list, point -> index);
    if(numChildern > 0){
      printStringOfChildern(list, list[point->child[i]], fileNum);

    }

  }

}

您会注意到上面的代码很糟糕且不完整,但它显示了我的打印功能的使用

下面的if else块是我如何打印输出,可以是一个文件或一系列文件。打印功能和这个if else块已经过测试,并证明可行。 inOutType是一个全局变量,因此是outputFileName。 fileIndex仅用于打印到多个文件的情况,并且在打印到多个文件的情况下,将调用此方法,但是有许多文件。这是打印功能

if(inOutType == 1 || inOutType == 2){
printLineToOutPut(output, outputFileName, inOutType);

}else{
    printToAInstanceFile(output, fileIndex);

  }

我在编辑中所做的就是更新样本,并写下

Output format:



index, numberOfChildern, child[i]. If child[i] has children then index, numberOfChildern, indexOf(child[i]), numberOfChildernOf(child[i]), child[i]OfChild[i]..... 

该方法执行如此

for(int j=0; j<maxNumberOfPoints; j++)
        printStringOfChildern(listOfListOfPoints[i], listOfListOfPoints[i][j], i);

1 个答案:

答案 0 :(得分:2)

如果没有关于输出应该是什么样子的明确示例,这里是所示代码的一个版本。请注意,我只是创建长度为32个字符的缓冲区,而不是花时间计算它们必须有多长。这不是很多记忆,而是手头的任务。此外,没有数据 - 我发明了一些数据:

Index 0:  3 children
    Index 1: 0 children
    Index 2: 2 children
        Index 4: 0 children
        Index 5: 0 children
    Index 3: 0 children

不需要任何其他数据;问题中结构的xyparent成员未被使用 - 消除不相关是创建MCVE(Minimal, Complete, Verifiable Example)的一部分。

我忽略了&#39; fileNum&#39;参数;打印简单而且仅限于标准输出。如果需要,可以很容易地将打印恢复到文件。我还使用了受JSON启发的符号来报告数据,将数组括在[…]和单点中,除了{…}内层次结构的顶部。

#include <stdio.h>
#include <string.h>

typedef struct node point;
typedef point **pointsList;

struct node
{
    int index; // the order in the instance file
    // int x;//x coord
    // int y;//y coord
    // int parent;//parent in tree when added
    int numChildren;// has val 0 -- 8 maybe, but doesn't matter the way I wrote it
    int *child;
};

static inline void print(const char *str)
{
    printf("%s", str);
}

static void printStringOfChildren(pointsList list, point *point)
{
    // print the index
    char index[32];
    sprintf(index, "%d", point->index);
    strcat(index, ", ");
    print(index);

    // print the number of children
    char children[32];
    sprintf(children, "%d", point->numChildren);
    strcat(children, ", ");
    print(children);

    // print the children
    print("[");
    for (int i = 0; i < point->numChildren; i++)
    {
        if (i > 0)
            print(",");
        print(" { ");
        printStringOfChildren(list, list[point->child[i]]);
        print(" }");
    }
    if (point->numChildren > 0)
        print(" ");
    print("]");
}

int main(void)
{
    point *list[] =
    {
        &(point){ 0, 3, (int[]){ 1, 2, 3 } },
        &(point){ 1, 0, 0 },
        &(point){ 2, 2, (int[]){ 4, 5 } },
        &(point){ 3, 0, 0 },
        &(point){ 4, 0, 0 },
        &(point){ 5, 0, 0 },
    };
    printStringOfChildren(list, list[0]);
    putchar('\n');

    return 0;
}

输出:

0, 3, [ { 1, 0, [] }, { 2, 2, [ { 4, 0, [] }, { 5, 0, [] } ] }, { 3, 0, [] } ]

还有很多其他方法可以完成输出。 sprintf()strcat()的整个业务都是假的 - 您可以很好地在我的方案中使用printf(),或者在更一般的情况下使用fprintf()来格式化数据,从而减少程序的大小还是更多。