2014-10-24 5 views
0

텍스트 파일에서 수학 표현식 세트 (x^2, sin x 등)를 취해 그래프에 그려주는 작은 프로그램을 작성하고 있습니다어떻게하면 링크드리스트의 멤버를 구조화 할 수 있습니까

typedef struct Expression 
{ 
    int r, g, b; 
    char* expression; 
} Expression; 

주 : 다음들은 구조체에 저장된 각 식을 읽은 선언 된 R, G, 그리고 B 변수 플롯 될 선의 색이며, 식 문자열로 저장되어있다.

내 연결리스트 노드는 다음과 같이 선언

:

typedef struct LinkedListNode 
{ 
    struct Expression *expression; 
    struct LinkedListNode *next; 
} LinkedListNode; 

typedef struct LinkedList 
{ 
    LinkedListNode *head; 
} LinkedList; 

EOF 때까지 while 루프 실행에 나는 표정을 읽을 할 모든 (나는이 모든 것을 알고 잘 작동) :

Expression* expression = (Expression*)malloc(sizeof(Expression)); 
LinkedList* expressionList; 
expressionList = createEmptyList(); 

while(!feof(readFile)) 
{ 
    fscanf(readFile, "%d %d %d %[^\n]s", &r, &g, &b, expr); 
    fgetc(readFile); 

    expression -> r = r; 
    expression -> g = g; 
    expression -> b = b; 
    expression -> expression = expr; 

    insertNodeFront(expressionList, expression); 
} 

void insertNodeFront(LinkedList *inList, Expression *inExpression) 
{ 
    LinkedListNode *newNode; 

    newNode = (LinkedListNode*)malloc(sizeof(LinkedListNode)); 
    newNode -> expression = inExpression; 
    newNode -> next = inList -> head; 
    inList -> head = newNode; 
} 

내가 그것을 어디 특히이 줄을 생각 : 나는 문제가 발생 곳

는 이제 insertNodeFront 기능입니다 모든 연결리스트의 각 표현식 구성원이 여전히 원래 표현 구조체를 가리키는

newNode -> expression = inExpression; 

때문에 그들은 모두 말 (분명 문제가)에서 동일한 값으로 끝날 것입니다, 그래서 내가가 있다고 가정 : 문제는있다 insertNodeFront 내에서 inExpression 포인터의 복사본을 만들지 만, 어떻게해야하는지 정확히 모르겠습니다. memcpy를 사용하는 모든 시도가 충돌을 일으켰습니다. (아마도 memcpy를 처음 사용하기 때문에 잘못된 것이 있습니다.) 당신은 포인터 inExpression 이후 newNode -> expression = inExpression;를 할당 할 수 없습니다

어떤 조언이 도움이 될 것입니다, 감사

+0

[while (! feof (f))'항상 틀립니다.] (https://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong) –

+0

문제가 생기면 그 대신에 무엇을 사용해야합니까? while (fgetc (f)! = EOF)? – Magikjak

+0

@ user2978566 "나는 그걸로 아무런 문제가 없었습니다."- 당신이'fscanf'와'fgetc' *가 성공했다는 가정하에 행진하기 전에 결코 확인하지 않기 때문입니다. 의견에 제공된 [** 링크 **] (http://stackoverflow.com/a/5432517/1322972)는 왜 그것이 거의 항상 잘못된지를 설명합니다. – WhozCraig

답변

1

은 프로그램에 보존되지 않습니다. newNode -> expression의 저장 영역을 할당하고 inExpression에 문자열 사본을 저장해야합니다. 그런 다음 문자열을 영구 저장을 만든

expression -> expression = strdup (expr); 

을 :이 작업을 수행하는 간단한 방법은 string.h을 포함하고 insertNodeFront를 호출하기 전에 strdup을 사용하는 것입니다. 참고 : strdup으로 할당 된 메모리를 확보해야합니다.

+0

그런 경우 나는 항상 참조 계산 된 문자열 구조를 구현하는 것이 그만한 가치가 있는지 궁금해했습니다. 그러나 나는 궁극적으로 "그것이 달려있다"고 생각합니다. – usr2564301