C 程序对文本文件中的单词进行排序并使用链表打印它们的频率,但频率没有被计算出来


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<malloc.h>
#include<ctype.h>
#define WS " ,t!:;.-" 
#define MAX_STR_LEN 1024 
int i;
struct listNode {
    int count;
char *word;
struct listNode *next;
}       //Definition of a structure
struct listNode *newListNode(const char * const);
void insertWord(struct listNode *,const char * const);
void printList(struct listNode *);
int countlist(struct listNode *);
 int main(int argc, char *argv[]) {
  FILE *fp;
static int j=0;
    char line[MAX_STR_LEN],*s,tem[99];
struct listNode *head = newListNode("");
   if(argc<2)
    {
    exit(0);
    }
  for(i=1;i<argc;i++)
  {
 fp = fopen(argv[1],"r")
 if(fp==0)
    {
    perror(argv[i]);
    continue;
    }
 {
    while (fgets(line,MAX_STR_LEN,fp) != NULL) 
    {
        *(strchr(line,'n')) = '';
          for (s = strtok(line,WS); s != NULL; s = strtok(NULL,WS))
            {
             insertWord(head,s);
             }
    }
    printList(head);
    fclose(fp);
} 
else {
    if (argc < 2) {
        printf("usage: %s <filename>n",argv[0]);
    } else {
        printf("%s not found.n",argv[1]);
    }
    }
    }   return 0;
    }

   /* 
   *   * newListNode: create new struct listNode 
    *     */
     struct listNode *newListNode(const char * const s) {
      struct listNode *n =
     (struct listNode*)malloc(sizeof( struct listNode ));
  n->word = (char *)malloc(sizeof( *s ) );
  strcpy(n->word,s);
 n->next = NULL;
  return n;
 }
  /* 
   *   * insertWord: insert given word into list in ascending order 
   *     */
  void insertWord(struct listNode *head,const char * const s) {
struct listNode *p = head,
    *q = newListNode(s);
p->count=p->count+1;
while ((p->next!= NULL) &&
              (strcmp(s,p->next->word) < 0))
    {
    p = p->next;
}
q->next = p->next;
p->next = q;
}

显示单词列表

  void printList(struct listNode *head) {
   struct listNode *p = head->next;
   while (p != NULL) {
 printf("%5d %sn",countlist(head),p->word);
 p=p->next;
}
puts("");
}

计算单词频率的函数

   int countlist(struct listNode *head) {
   struct listNode *p = head->next;
while (p != NULL) {
 if(strcmp(p->word,p->next->word)==0)
p->count=p->count+1;
p=p->next;
 }
return(p->count);
 }

我的程序基本上是使用链表从多个文本文件中读取单词。按字母顺序(ASCII 值(对它们进行排序,然后计算每个单词存在的次数。

所以有几件事,

    fp = fopen(argv[1],"r");
    if(fp==0)
    {
        perror(argv[i]);
        continue;
    }

确实需要与 NULL 进行比较,而不是零。

fopen 手册页: "成功完成后,fopen((,fdopen((和freopen((返回一个文件 指针。 否则,返回 NULL 并设置全局变量 errno 以指示错误。

健全性节省程序:如果重新排列比较语句以将值作为左侧值,则编译器将不允许意外赋值语句。不仅仅是这个问题,几乎任何比较。即

    if(NULL==fp){
        perror(argv[1]);
        continue;
    }//end if

    if(0==strcmp(p->word,p->next->word)){
        //code to do stuff
    }//end if

关于频率问题,你指的是 countList(( 没有返回一个正确的整数吗?为什么不直接使用一个整数来保存计数并返回它,或者您希望每个节点在其结构中都有其相对频率?

countlist()中,这是错误的:

while (p != NULL) {
 if(strcmp(p->word,p->next->word)==0)

由于访问了p->next指向的列表节点,因此必须断言p->next不为 null:

    while (p->next)…

相关内容

  • 没有找到相关文章

最新更新