Cake-like链表

时间:2015-02-03 06:26:01

标签: c struct linked-list

我提前道歉,因为缺乏专业知识...... 但前段时间我的任务是列出一个数字的所有因素。 虽然我确定还有其他更有效的方法, 我特别想要的是创建一个具有这种形式的结构:

...
struct f{
int a;
struct f *b;
int c;
};

struct f factor = {

{factor_first, factor+1, factor_last},

{factor_second,factor+2, factor_second-to-last},

....(continued)

}

所以最终结构看起来像:

factor = {factor_first, factor_second, factor_third ... ,factor_last}

问题在于:

1)我不知道会有多少因素,因此列表会有多长。

2)在我成功制作列表的情况下,如何消除对因子+某些#的最终引用以使列表连续?

3)我打算使用for循环,但意识到我可能做不到这样的事情:

if (n%i==0) /* n is the number to be factored, by the way */

factor+i = {i, factor+i+1, n/i}

4)总而言之,我完全无能为力......

无论如何,我知道有一个更好的方法来找到一个数字的因素,但是因为我是初学者,我只是好奇如何(如果可能的话)我可以实现这个(以这种特殊的方式制作类似蛋糕的链表)


看到评论后,我决定尝试应用它:

#include <stdio.h>
#include <stdlib.h>
main()
{

    typedef struct f{
    int a;
    struct f *b;
    int c;
    } FACTOR;

    int n, i, j = 0;

    scanf_s("%d", &n, sizeof(&n)); /*gets n*/

    FACTOR *pTF;
    FACTOR *head = pTF;

    for (i = 1; i*i <= n; i++)
    {
        if (n%i == 0)
        {
            pTF = malloc(sizeof(struct f));
            pTF[j]->a = i;
            pTF[j]->c = n / i;
            pTF[j]->b = malloc(sizeof(struct f));
            pTF[j + 1] = malloc(sizeof(struct f));
            pTF[j]->b = pTF[0 + j + 1];
            j++;
        }

    }
}

并且不知何故它不起作用......我认为它与...有关 结构和指针之间的转换,但我似乎无法掌握它:(

我想我不能通过pTF [行号]方便地调用行? 但我怎么能这样做呢?


一个月后,我回来了一个解决方案:

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

typedef struct f{
    int s;
    struct f *link;
    int b;
} FACT;

Factprint(FACT *a) //prints this structure in correct sequence.
{
    if(a != NULL)
    {
        printf("%d ", a->s);
        Factprint(a->link);
        if(a->s!=a->b) printf("%d ", a->b); //skips a square
    }
}

int main()
{
    int num, i;
    scanf("%d", &num);
    FACT *x, *tmp_1, *tmp_2;
    x = malloc(sizeof(FACT));
    tmp_1 = x;
    i = 1;

    for (i = 1; i*i <= num; i++)
    {
        if (num%i == 0) //a factor
        {
            tmp_2 = malloc(sizeof(FACT));
            tmp_2->s = i; //first get the factors
            tmp_2->link = '\0';
            tmp_2->b = num / i;
            tmp_1->link = tmp_2; // then connect to the previous link
            tmp_1 = tmp_2; //now go down the link...
        }
    }

    Factprint(x->link);
}

1 个答案:

答案 0 :(得分:1)

定义指针struct f *pointerToFactor,并通过struct f *head = pointerToFator保留对第一个因子的引用,以便在需要时遍历链表。

pointerToFactor = malloc(sizeof(struct f));
pointerToFactor->a = factor_first;
pointerToFactor->c = factor_last;

当你得到第二个因素时

pointerToFactor->b = malloc(sizeOf(struct f));
struct f *temp = pointerToFactor->b;
temp->a = factor_second;
pointerToFactor->c = factor_second_last;

以这种方式遍历所有因素,你有一个所有因素的链表。

修改

指针增量工作完全不同。假设,我有一个指向structure的指针,其大小为20,基址为4090.如果我递增数组,比如指针[1],现在指针指向5010, 20的下一个内存块。指针增量取决于分配给元素的大小。