2014-06-05 5 views
0

텍스트 파일에서 단일 링크 목록으로 일부 이름을 복사하려면 다음 코드를 작성하십시오. 및 이름은 사전 순으로 인쇄해야하며 빈도도 표시해야합니다. 그러나 출력에서 ​​텍스트 파일에없는 성 앞에 성가신 일부 문자가 표시됩니다. 누구나 그 이유를 말해 줄 수 있습니까?단일 링크 목록 출력

주요

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

void main() 
{ 
tip_nod *prim, *ultim; 
tip_nod *p; 
char *word; 
FILE *fin; 

prim = ultim = NULL; 

fin = fopen("alf.txt", "r"); 
if(!fin) 
{ 
    perror("\nEroare la deschiderea fisierului"); 
    exit(-1); 
} 

while(!feof(fin)) 
{ 
    word = (char *)malloc(100); 
    if(word==NULL) 
    { 
     fprintf(stdout,"Eroare la alocarea memoriei!"); 
     exit(-1); 
    } 
    fscanf(fin, "%s", word); 
    p = (tip_nod*)malloc(sizeof(tip_nod)); 
    if(p==NULL) 
    { 
     fprintf(stdout, "Eroare la alocarea memoriei p"); 
     exit(-2); 
    } 
    p->nume = word; 
    creare_lista(&prim, &ultim, p); 

} 
afisare(prim); 
} 

ALFA.C

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


void creare_lista(tip_nod **prim, tip_nod **ultim, tip_nod *p) 
{ 
tip_nod *q, *q1; 
p->urm = NULL; 
p->frec = 1; 
if((*prim)==NULL) 
{ 
    (*prim)= (*ultim) = p; 
} 
else 
{ 
    q = *prim; 
    q1 = NULL; 
    while((q!=NULL) && (strcmp(q->nume,p->nume))<0) 
    { 
     q1 = q; 
     q = q->urm; 
    } 
    if(q!=NULL) 
    { 
     if(strcmp(p->nume, q->nume)==0) (q->frec)++; 
     if(strcmp(q->nume, p->nume)>0) 
     { 
      if(q1==NULL) 
      { 
       p->urm = (*prim); 
       (*prim) = p; 
      } 
      else 
      { 
       p->urm = q1->urm; 
       q1->urm = p; 
      } 
     } 
    } 
    else 
    { 
     (*ultim)-> urm = p; 
     (*ultim) = p; 
    } 
} 
} 

void afisare(tip_nod *prim) 
{ 
tip_nod *p; 


if(prim==NULL) 
{ 
    printf("\nLista este vida!"); 
    return(-1); 
} 
else 
{ 
    p = prim; 
    while(p!=NULL) 
    { 
     fprintf(stdout,"%s : %d ",p->nume, p->frec); 
     p = p->urm; 
    } 
} 
} 

헤더 파일

#ifndef ALFA_H_INCLUDED 
#define ALFA_H_INCLUDED 

typedef struct tip_nod 
{ 
char *nume; 
int frec; 
struct tip_nod *urm; 
}tip_nod; 

void creare_lista(tip_nod **prim, tip_nod **ultim, tip_nod *p); 
void afisare(tip_nod *); 


#endif // ALFA_H_INCLUDED 
+0

'동안 (FeO의 f (fin))'-> 이것이 이유입니다. 읽은 후에 EOF를 확인해야합니다. –

+0

같은 결과입니다. – sixfeet

+0

코드에 차이가 보이지 않습니다. –

답변

1

간단한 수정 :!

while(1) 
{ 
    word = (char *)malloc(100); 
    if(word==NULL) 
    { 
     fprintf(stdout,"Eroare la alocarea memoriei!"); 
     exit(-1); 
    } 
    int retValue = fscanf(fin, "%s", word); 
    if(retValue < 0) 
     break; 
    p = (tip_nod*)malloc(sizeof(tip_nod)); 
    if(p==NULL) 
    { 
     fprintf(stdout, "Eroare la alocarea memoriei p"); 
     exit(-2); 
    } 
    p->nume = word; 
    creare_lista(&prim, &ultim, p); 

} 
+0

하지만 한 단어를 읽은 후 while 루프가 멈추고 연결된 목록이 비어 있습니다. – sixfeet

+0

@sixfeet fscanf는 오류가 발생했을 때 값이 0보다 작은 값만 반환합니다. 그렇다면 입력에 문제가 있습니다. –

+0

작품, 고마워요! :) – sixfeet