无头少女 2021-06-07 08:04 采纳率: 40%
浏览 22
已采纳

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

 

#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);

}

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

  • 写回答

1条回答 默认 最新

  • qzjhjxj 2021-06-07 17:21
    关注

    修改如下,供参考:

    #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;
    }
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况
  • ¥15 画两个图 python或R