2015-02-03 2 views
0

전적으로 전문 지식이 부족한 것에 대해 사과드립니다 ... 하지만 얼마 전에 모든 숫자의 요소를 나열해야했습니다. 그래서 궁극적으로 구조의 모습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) 

} 

: 나는 다른 더 효율적인 방법이 거기 밖으로 확신하지만 , 나는 특히이 있었다 아이디어는 이러한 형태 인 구조를 만드는 것이 었습니다 :

1) 내가 거기에 얼마나 많은 요인 모르는, 따라서 얼마나 오래 목록은 다음과 같습니다

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

문제가 있다는 것입니다.

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++; 
     } 

    } 
} 

를 어떻게 든이 작동하지 않습니다 ... 나는이 구조체와 포인터 사이의 전환과 관련이있다 생각하지만, 나는 할 수 있습니다

설명을 본 후, 나는 그것을 적용하기로 결정 t는 그것을 이해하는 것 : (

나는 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

포인터 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의 다음 메모리 블록을 가리 킵니다.포인터 증분은 요소의 크기에 따라 달라집니다.

+0

답변 해 주셔서 감사합니다. 그러나 요인을 자동으로 찾을 수도 있습니까? 나는 초보적인 시도로 원래의 게시물을 업데이트했지만, 그것은 꽤 결함이있는 것 같다. –

+0

자동으로와 같은 것은 없으며 논리를 프로그래밍해야합니다. 그러나 단순히 나머지를 나누고 확인하는 것이 트릭을 수행합니다. – saikumarm