单链接列表输出

时间:2014-06-05 19:36:25

标签: c list linked-list

我编写了以下代码,从文本文件复制到单个链接列表中的一些名称, 并且名称必须按字母顺序打印并显示频率。 但是在输出中我得到了一些不在文本文件中的姓氏之前的奇怪字符。 谁能告诉我为什么?

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

1 个答案:

答案 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);

}