2016-06-03 3 views
0

모든 것을 잘 저장할 수 있습니다. 하지만 연결된 목록 내에서 배열을 구현할 때 문제가 발생합니다. baratok은 주어진 입력이 -1이 될 때까지 숫자 값을 보유합니다. 하지만 인쇄하려고하면 -1 만 준다. 그렇다면 이것에 대한 적절한 구현이 무엇일까요?C에서 연결된 목록 내에서 배열을 구현하는 방법

내 코드 :

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int getl(char s[], int lim) 
{ 
int c,i; 
for(i = 0; i < lim && (c = getchar()) != '\n' && c!=EOF; i++) 
s[i] = c; 
s[i] = '\0'; 
while(c != '\n' && c!=EOF) 
c=getchar(); 
return i; 
} 

struct szemelylista { 

    int szemelyId; 
    char nev[50]; 
    int *baratok; 
    struct szemelylista *kov; 
} ; 

int main() 
{ 
    struct szemelylista *llist = NULL, *elozo, *horgony; 
    int ct = 0, barat, i; 
    char s[50]; 

    horgony = elozo = NULL; 
    while(printf("Name: ") && getl(s, 50)) 
    { 
     if(!(llist = (struct szemelylista*)malloc(sizeof(struct szemelylista)))) { 
      break; 
     } 


     if(horgony) { 
      elozo ->kov = llist; 
     } else { 
      horgony = llist; 
     } 
     elozo = llist; 

     llist -> kov = NULL; 


     llist->szemelyId = ct; 

     strcpy(llist->nev, s); 

     printf("Friends: "); //this is the problematic part I guess 
     getl(s, 50); 
     barat = atoi(s); 
     llist->baratok = barat; 
     while(barat != -1) { 
     getl(s, 50); 
     barat = atoi(s); 
     llist->baratok = barat; //until here 
     } 

     ct++; 
    } 

    llist = horgony; 

    printf("ID\Name\Friends\tFriends with text\n"); 
    printf("--------------------------------------------\n"); 
    while(llist) { 

     printf("\t%d\t%s\t%d\t\n", llist->szemelyId, llist->nev, llist->baratok); 
     llist = llist->kov; 

    } 

}

답변

4

그냥 어떻게 든 하나의 포인터로 여러 번 할당 할 수없는 여러 값이 저장되어있어 생각합니다. 그것은 그렇게 작동하지 않습니다. 각 할당은 해당 변수의 이전 값을 완전히 덮어 씁니다.

당신은 실제로 어느 고정 된 크기의 배열을함으로써 배열을 관리 할 필요가

:

int baratok[100]; /* Max 100 numbers, no idea if this is sensible for you. */ 

이상의 공간으로 realloc()를 사용하여 (malloc() 사용) 힙에 동적 배열을 할당하고 성장하여 필요하다).

두 경우 모두 현재 할당 최대 값까지 추가 된 번호를 추적하는 또 다른 변수를 추가해야합니다.

메모리 관리는 기대했던 것보다 조금 복잡합니다.보다 기본적인 C 참조 자료를 읽어야합니다.

+0

감사합니다. 배열 하나가 작동했습니다. 그러나, 내가 그것을 인쇄 할 때 0 (나머지) (sizeof (llist-> baratok)/sizeof (llist-> baratok [0]) 채 웁니다. 어떻게 실제로 포함 된 숫자와 일치하도록 각 루프 내의 숫자를 인쇄 할 수 있습니다. ? –