C 单链接列表输出
我编写了以下代码,将一些名称从文本文件复制到单个链接列表中, 姓名必须按字母顺序打印,并显示频率。 但是在输出中,我在姓氏之前得到了一些不在文本文件中的奇怪字符。 谁能告诉我为什么 主要 一个简单的解决方案:C 单链接列表输出,c,list,linked-list,C,List,Linked List,我编写了以下代码,将一些名称从文本文件复制到单个链接列表中, 姓名必须按字母顺序打印,并显示频率。 但是在输出中,我在姓氏之前得到了一些不在文本文件中的奇怪字符。 谁能告诉我为什么 主要 一个简单的解决方案: while(1) { word = (char *)malloc(100); if(word==NULL) { fprintf(stdout,"Eroare la alocarea memoriei!"); exit(-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);
}
while(1)
{
单词=(字符*)malloc(100);
if(word==NULL)
{
fprintf(标准语,“爱你的回忆!”);
出口(-1);
}
int retValue=fscanf(fin,“%s”,字);
如果(返回值<0)
打破
p=(tip_nod*)malloc(sizeof(tip_nod));
if(p==NULL)
{
fprintf(标准为“爱的回忆”);
出口(-2);
}
p->nume=word;
creare_lista(&prim,&ultim,p);
}
而(!feof(fin))
->这就是原因。您需要在读取后检查EOF,而不是在读取前检查。我看不到您的代码有任何差异。但如果我这样做,在读取一个单词后,while循环将停止,我的链接列表将被删除empty@sixfeetfscanf
仅在发生错误时返回小于0
的值。如果是这样,那么你的输入就有问题了。
#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
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);
}