我编写了以下代码,从文本文件复制到单个链接列表中的一些名称, 并且名称必须按字母顺序打印并显示频率。 但是在输出中我得到了一些不在文本文件中的姓氏之前的奇怪字符。 谁能告诉我为什么?
MAIN
#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;
}
}
}
HEADER FILE
#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 :(得分: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);
}