파싱해서 파일의 데이터를 읽어올때 연결리스트의 malloc부분 질문입니다.
글쓴이: alsrud / 작성시간: 수, 2014/12/10 - 9:51오전
load함수를 이용해 파일로부터 연결리스트의 내용을 읽어들일 때
안풀리는 점이 있어 질문 드립니다.
아래와 같이 메인함수에서 load함수를 호출하고
아래 load함수에서 동적할당을 받아 내용을 불러오는 내용인데요ㅜㅜ
아무리 머리를 굴려서 코드를 수정해도 마지막에 암묵적인 tail이 존재하게 됩니다.
이 암묵적인 tail 없이 메모리를 불러오려면 어떤 방식으로 접근을 해야할까요ㅜㅜ?
int main()
{
char *fname = "address.txt";
char id[ID_SIZE];
int i;
struct addr *t;
struct addr *head; = (struct addr*)malloc(sizeof(struct addr));
load_addr(fname, head);
생략
}
struct addr* load_addr(char *s, struct addr *t)
{
FILE *fp = fopen(s, "r");
char buf[500];
char *temp = NULL;
char *delim = "|\n";
int i = 0;
if(fp == NULL) {
printf("%s\n파일이 존재하지 안습니다.", s);
return NULL;
}
while(fgets(buf, 500, fp) != NULL) {
t->next = (struct addr*)malloc(sizeof(struct addr));
temp = strtok(buf, delim);
if(i++ == 0)
strncpy(t->part, temp, sizeof(t->part));
while(temp != NULL) {
temp = strtok(NULL, delim);
if(i == 1) {
strncpy(t->name, temp, sizeof(t->name));
i++;
}else if(i == 2) {
strncpy(t->position, temp, sizeof(t->position));
i++;
}else if(i == 3) {
strncpy(t->id, temp, sizeof(t->id));
i++;
}else if(i == 4) {
strncpy(t->tel, temp, sizeof(t->tel));
i++;
}else if(i == 5) {
strncpy(t->phone, temp, sizeof(t->phone));
i++;
}else if(i == 6) {
strncpy(t->extension, temp, sizeof(t->extension));
i++;
}else if(i == 7) {
strncpy(t->email, temp, sizeof(t->email));
i = 0;
}
}
t = t->next;
t->next = NULL;
}
fclose(fp);
return t;
}Forums:


1) t 포인터 말고 포인터 prev를 하나 더
1)
t 포인터 말고 포인터 prev를 하나 더 두어서 현재 t 의 바로 앞 노드를 가리키도록 한 다음에
루프 빠져나온 후에 마지막 tail노드 삭제
2)
카운트 변수를 따로 두어 (지금 보면 i 를 써도 될 듯), 제일 첫 루프에서는 t가 가리키는 노드를 채우고, 그 다음 루프부터는 새 노드를 만들어 채움
while (한줄 읽고) { if ( 이번이 첫 번째 루프가 아니면 ) { t->next = malloc(...); t = t->next; } 이제 buf의 내용을 t에 채운 후 t->next = NULL; }등등의 방법이 있겠네요.
좋은 하루 되세요!
유용한 팁 감사합니다 :)
1)
t 포인터 말고 포인터 prev를 하나 더 두어서 현재 t 의 바로 앞 노드를 가리키도록 한 다음에
루프 빠져나온 후에 마지막 tail노드 삭제
1번으로 해결했습니다 ^^
댓글 달기