我提前道歉,因为缺乏专业知识...... 但前段时间我的任务是列出一个数字的所有因素。 虽然我确定还有其他更有效的方法, 我特别想要的是创建一个具有这种形式的结构:
...
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);
}
答案 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
的下一个内存块。指针增量取决于分配给元素的大小。