使用Struct从C中的函数返回数字列表

时间:2018-01-04 13:32:25

标签: c arrays database struct

我正在尝试解决此代码问答kata

基本上我需要编写一个程序,从一个具有array/list乘法的特定范围(数字)中吐出k primes个数字。

countKprimes(5, 500, 600) --> [500, 520, 552, 567, 588, 592, 594]

现在我的程序“正常”,因为它可以正确打印结果,但如果我把它放在代码报的回答区域(当然没有main),它就会永远运行。

“错误代码SIGKILL:流程已终止。完成时间超过12000毫秒”

这是代码战模板

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

// In the preloaded section are some functions that can help.
// They can be used as a small library.
// There is no file to include, only the templates below.

struct node {
    int data;
    struct node *next;
};
struct list {
    size_t sz;
    struct node *head;
};

struct list* createList();

// push data at the head of the list
void insertFirst(struct list* l, int data);

struct list* reverse(struct list* l);

void listFree(struct list* l);

// functions to write
struct list* kPrimes(int k, int start, int nd)
{
    // your code
}

这是我的代码

#include <stdio.h>

struct list{
    int a[600];
};

int smallestPrimeFactor(int number){
        int x;

        for(x = 2; x < number; x++) {
                if(number % x == 0) {
                        return x;
                }
        }
        return number;
}

int primefactors(int ofnumber){
        static int counter = 0;
        int tempcounter = counter;
        int nextnumber = ofnumber/smallestPrimeFactor(ofnumber);
        if(nextnumber != 1) {
                if(ofnumber >= nextnumber) {
                        counter++;
                        primefactors(nextnumber);
                }
        }
        return (counter - tempcounter) + 1;
}

struct list kPrimes(int k, int start, int nd){
    int x, g = 0;
    struct list ls;
    for(x = start; x < nd; x++){
        if(primefactors(x) == k){
            ls.a[g] = x;
            g++;
        }
    }
    return ls;
}

int main(int argc, int **argv){
    int p = 5, s = 500, e = 600;
    int j = 0;

    while(kPrimes(p, s, e).a[j] != '\0'){
        printf("%d\n", kPrimes(p, s, e).a[j]);
        j++;

    }
}

我认为罪魁祸首是

struct list{
    int a[600];
};

也许在阅读数组时,测试文件超过了'\0'之后的索引。

我想到了通过使a指向整数的指针来解决这个问题的方法,但是int *a;执行任何操作都没有。

我知道返回数组的方法不止一种。使用referance,使用静态数组,将数组作为参数传递等。但我想解决这种代码问题的方式。认为这将是一个很好的学习经历。

那么,我应该如何使用

struct node {
    int data;
    struct node *next;
};
struct list {
    size_t sz;
    struct node *head;
};

解决问题?

2 个答案:

答案 0 :(得分:0)

你不应该为结构本身而烦恼,你应该只使用提供的函数:

struct list* kPrimes(int k, int start, int nd){
    int x, g = 0;
    struct list *ls = createList(); // 1. Create the list.
                                    // 2. Maybe check if ls != NULL...
    for(x = start; x < nd; x++){
        if(primefactors(x) == k){
            insertFirst(ls, x);     // 3. Insert at the beginning.
            g++;
        }
    }

    struct list *rls = reverse(ls); // 4. Reverse the list.
    listFree(ls);                   // 5. Free the original list.
    return rls;                     // 6. Return the reversed list.
}

由于函数reverse没有记录,我只能猜测它会创建一个新列表而不修改旧列表,这就是你需要在之后释放它的原因。

答案 1 :(得分:0)

createList()insertFirst()reverse()listFree()函数,以及消耗 函数返回值的函数全部都提供给您,它们都使用struct liststruct node类型。那么,如果你试图使用与现有函数不同的struct list使用它,那么你怎么能想到呢?

所以是的,您应该使用提供给您的struct nodestruct list类型 - 以及操作它们的便捷函数 - 而不是使用相同的标记定义不同的结构类型。