蛋糕状链表
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
的下一个内存块。指针增量取决于分配给的元素的大小。
对于完全缺乏专业知识,我提前表示歉意... 但前段时间我的任务是列出一个数字的所有因数。 虽然我确信还有其他更有效的方法, 我特别的想法是创建一个具有这种形式的结构:
...
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
的下一个内存块。指针增量取决于分配给的元素的大小。