蛋糕状链表

Cake-Like 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)如果我成功列了表,如何去掉最后对factor+some#的引用,使表连续?

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 = '[=14=]';
            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);
}

定义一个指针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 的下一个内存块。指针增量取决于分配给的元素的大小。