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