基于单链表在一个文件中输出所有不相同的单词并打印视频

 

#include <malloc.h>

#include <string.h>

#include <iostream>

using namespace std;

typedef struct node{

 char data[20];

 int count;

 struct node *next;

}LNode,*LinkList;

void init(LinkList *L);//初始化链表 

void distinguish_count();//截取单词并输入进2单链表,统计了重复个数,并输出链表 

void input(LinkList L,char *a);//于dis..函数中帮助实现向链表输入单词,统计重复个数 

void print_1(LinkList L);//打印出每个节点的单词与词频

void init(LinkList *L){

 (*L)=(LinkList)malloc(sizeof(LNode));

 (*L)->next=NULL;

 

void distinguish_count(LinkList L){ 

 FILE *fp;

 char arr[20],c;

 init(&L);

 fp=fopen("Infile.txt","r");

 if(fp==NULL)

  printf("fall to open!\n");

 else{

  while(!feof(fp)){//循环到文件结束 

   printf("test ");

    int i=0;

   arr[0]={'\0'};

   //截取一个单词(大写) 

   while((c=fgetc(fp)!=EOF)&&c!=' '&&c!=','&&c!='.'&&c!=';'){

   //全部大写化 

    if(c>='a'&&c<='z')

     c+=32;  

    arr[i]=c;

    ++i;

                

   }

   arr[i]={'\0'};

   if(arr[0]!='\0')

    input(L,arr);

 }}

 print_1(L);

 fclose(fp); 

}

 

//查词频 头插法 

void input(LinkList L,char *a){

 LinkList P;

 LinkList Q;

 Q=L->next ;

 int flag;

 //查重 

 for(Q=L;Q->next!=NULL;Q=Q->next){

  if(stricmp(a,Q->data)==0 ){

   Q->count++;

   flag=1;

   break;

  }

 } 

 

 //头插法  

 if(flag==0){

  P=(LinkList)malloc(sizeof(LNode));

  strcpy(P->data,a);

  P->count=1;

  P->next =L->next ;

  L->next =P;

 } 

 

//打印单词及其词频 

void print_1(LinkList L){

  LinkList p;

  p=L->next;

  while(p!=NULL){

   cout<<"word:"<<p->data<<" "<<"count:"<<p->count <<endl;

  p=p->next;

 }

 

int main(){

 LinkList L;

 distinguish_count(L);

}

为什么该程序没有报错,但是就是运行打印出来的是一行笑脸,与本身文件内容不符。球球大佬,救救孩子,孩子实训熬不过去了

修改如下,供参考:

#include <malloc.h>
#include <string.h>
#include <iostream>
#include <iomanip>

using namespace std;

typedef struct node{
        char data[20];
         int count;
      struct node *next;

}LNode,*LinkList;

void     init(LinkList *L);//初始化链表
void     distinguish_count();//截取单词并输入进2单链表,统计了重复个数,并输出链表
LinkList input(LinkList *L,char *a);//于dis..函数中帮助实现向链表输入单词,统计重复个数
void     print_1(LinkList L);//打印出每个节点的单词与词频

void init(LinkList *L)
{
   (*L)=(LinkList)malloc(sizeof(LNode));
   strcpy((*L)->data,"\0");
   (*L)->count = 0;
   (*L)->next=NULL;
}

void distinguish_count()
{

    FILE *fp;
    LinkList L;
    char arr[20]={0},c;
    init(&L);
    fp=fopen("Infile.txt","r");
    if(fp==NULL){
        printf("fail to open!\n");
        return;
    }
    int i=0;
    while((c=fgetc(fp))!=EOF){
         if(c!=' ' && c!=',' && c!='.' && c!=';' && c!='\\' && c!=':'){
            if(c>='a'&&c<='z')  c-=32; //全部大写化
            arr[i]=c;
            i++;
         }
         else{
            if(i!=0){
               arr[i]='\0';
               L=input(&L,arr);
            }
            for(i=0;i<20;i++)arr[i]=0;
            i=0;
         }
    }
    fclose(fp);
    print_1(L);
}

 

//查词频 头插法 

LinkList input(LinkList *L,char *a)
{
     LinkList P=NULL,Q=NULL,R;
     int flag=0;
     for(Q=(*L),R=NULL;Q!=NULL;R = Q,Q=Q->next){ //查重
         if(strcmp(Q->data,a)==0 ){
            Q->count++;
            flag=1;
            break;
         }
     }
     if(flag==0){ //头插法
         P=(LinkList)malloc(sizeof(LNode));
         strcpy(P->data,a);
         P->count=1;
         if((*L)->next==NULL){
            P->next =(*L)->next ;
            (*L)->next =P;
         }else{
            P->next =R->next;
            R->next =P;
         }
     }
     return (*L);
}

//打印单词及其词频

void print_1(LinkList L)
{
     LinkList p;
     p=L->next;
     while(p!=NULL){
        cout<<"word:"<<setw(20)<<setiosflags(ios::left)<<p->data<<" "<<"count:"<<p->count<<endl;
        p=p->next;
     }
}

int main()
{
     //LinkList L;
     distinguish_count();
     
     return 0;
}