2010-06-15 3 views
3

링크 된 목록과 관련하여 질문이 있습니다. 예를 들어, 다음과 같은 구조체 및 함수가 있습니다. 은 if 명령문의 첫번째 부분에서 C 연결 목록의 정수에 값 할당

struct node { 
    int value; 
    struct node *next; 
}; 

struct entrynode { 
    struct node *first; 
    struct node *last; 
    int length; 
}; 
void addnode(struct entrynode *entry) { 
    struct node *nextnode = (struct node *)malloc(sizeof(struct node)); 
    int temp; 
    if(entry->first == NULL) { 
     printf("Please enter an integer.\n"); 
     scanf("%d", &temp); 
     nextnode->value = temp; 
     nextnode->next = NULL; 
     entry->first = nextnode; 
     entry->last = nextnode; 
     entry->length++; 
    } else { 
     entry->last->next = nextnode; 
     printf("Please enter an integer.\n"); 
     scanf("%d", nextnode->value); 
     nextnode->next = NULL; 
     entry->last = nextnode; 
     entry->length++; 
    } 

} 

는, I는 임시 변수에 저장 입력 후 구조체의 필드에 해당 할당. else 브랜치는 작동하지 않는 직접 할당하려고했습니다. 직접 할당하는 방법은 무엇입니까?

감사합니다. , scanf("%d", &(nextnode->value));

는 일반적으로 코드에 주석으로 복사 - 붙여 넣기 안티 패턴으로 알려진 코드를 반복하지 않도록 :

답변

5

그것은 값의 주소 여야합니다

0

scanf("%d", &(nextnode->value));을보십시오. 최대로 다시 사용하십시오. 보통 코드를 반복하는 상황에 처하면 작은 함수를 만듭니다.

2
scanf("%d", nextnode->value); 

scanf()를 만족 시키려면 value 멤버에 대한 포인터를 전달해야합니다. 수정 :

scanf("%d", &nextnode->value); 

아마도 하나의 교훈이 배울 데이터 구조 변경 코드 결코 혼합 된 데이터 항목 코드입니다.

Btw : 불필요한 괄호를 사용하지 마십시오. 그렇게한다면 선행 규칙을 배울 수 없습니다.

1

먼저 버그가 있습니다.

scanf("%d", &(nextnode->value));

그리고 죄송 이런 말을하지만 코드는 끔찍한입니다 : 라인의

하나는해야한다!

  • entrynode보다 더 나은 이름을 사용하십시오. 링크 된 목록이라면 그냥 부르면 되겠습니까?

  • 나는 다음과 같은 서명하는 방법 구현 제안 :

    부울 addNode 명 (구조체 entrynode * 항목, int 값을);

  • 반환 값을 사용하면 추가가 성공했는지 알 수 있습니다.

  • 많은 코드 중복이 있습니다. 그것을 제거하려고합니다.

  • 후에 printf 및 scanf를 호출하십시오.

그것은 날의 printf와 scanf와 데이터 구조 삽입 방법 다음 elses의 경우에 산재 코드의 중복 사본 내에 산재 해보고 전율한다.

+0

비판 해 주셔서 감사 드리며, 오랫동안 프로그래밍하지 않았습니다. 당신의 충고를 받아 들일 것입니다! –

0

또한 malloc() 호출의 반환 값을 확인하십시오.또한 C 프로그래밍 언어로 반환 값 malloc()을 캐스팅하지 마십시오.