user-0 提问: 从文件中读单词并统计个数

回复:
user: user-1
content: 啊呀，传错代码了 不好意思啊 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct wstr { char w[50]; int count; struct wstr *next; }WORD;  void main() {     FILE *fp; WORD *h,*p,*q; char word[50]; h=(WORD*)malloc(sizeof(WORD));  h->next=NULL; p=h;//h->next  if((fp=fopen("s.txt","r"))==NULL) { printf("Can't open file");     return; }   while(fscanf(fp,"%s",word)!=EOF) {      q=h->next;	 	while(q!=NULL&&strcmp(q->w,word)) 		q=q->next;  	if(q!=NULL) 		q->count++; 	else 	{ 	q=(WORD*)malloc(sizeof(WORD)); 	strcpy(q->w,word); 	q->count=1; 	q->next=NULL; //新加的 	p->next=q; 	p=p->next;  	} } //新加的 p=h->next;  while(p!=NULL)  {  printf("%s  %d",p->w,p->count);  p=p->next;  } }

user: user-1
content: 楼主，你MALLOC的q并没有添加到h链表中  我帮你改了下#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct wstr { char w[50]; int count; struct wstr *next; }WORD;  void main() {     FILE *fp; WORD *h,*p,*q; char word[50]; h=(WORD*)malloc(sizeof(WORD));  h->next=NULL; p=h;//h->next  if((fp=fopen("s.txt","r"))==NULL) { printf("Can't open file");     return; }   while(fscanf(fp,"%s",word)!=EOF) {      q=h->next;	 	while(q!=NULL&&strcmp(q->w,word)) 		q=q->next;  	if(q!=NULL) 		q->count++; 	else 	{ 	q=(WORD*)malloc(sizeof(WORD)); 	strcpy(q->w,word); 	q->count=1; 	q->next=NULL; //新加的 	p->next=q;  	} } //新加的 p=p->next;  while(p!=NULL)  {  printf("%s  %d",p->w,p->count);  p=p->next;  } }   你看看有没有错误，我随便试了一个能成功

user: user-2
content: 运行不出来是个什么概念呢？ 是运行了后什么都没有？还是运行了，没有得到输出结果 只得到请按任意键结束呢？ 打个断点调试下吧

user: user-0
content: 恩恩，谢谢，你们真是好人

user: user-3
content: void insert(struct wstr *head, struct wstr *i_new) { 	int n = 0; 	struct wstr *p, *q;  	p = head; 	q = head->next; 	while(q) 	{ 		while(q->w[n] == i_new->w[n])		//跳过前面相等的字符,你也可以使用字符比较函数 		{ 			++n; 		} 		if (q->w[n] > i_new->w[n])		//q字符大于i_new字符，插在i_new之前,返回 		{ 			p->next = i_new; 			i_new->next = q; 			return; 		} 		else							//q字符小于i_new字符，下偏移一个结点，继续			 		{ 			n = 0; 			p = q; 			q = q->next; 		}  	}//循环结束，说明只能插入到尾部 	i_new->next = q; 	p->next = i_new;  } void main() { ... while(fscanf(fp,"%s",word)!=EOF)  {   while(q!=NULL&&strcmp(q->w,word))     q=q->next;   if(q!=NULL)  q->count++;   else{   q=(WORD*)malloc(sizeof(WORD));   strcpy(q->w,word);   q->count=1;   insert(h, q);   }   ... }   临时写的，你自己测试一下

user: user-0
content: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> typedef struct wstr { 	char w[50]; 	int count; 	struct wstr *next; }WORD;  typedef struct word { 	char words[50]; 	int counts; }NEWWORD;  int cmp(const void *a,const void *b) { 	return ((NEWWORD *)b)->counts-((NEWWORD *)a)->counts; }  void main() {     FILE *fp; 	WORD *h,*p,*q; 	char word[50]; 	int wordcount=0,i=0; 	 	NEWWORD **wordarr, *t; 	 	//h=(WORD*)malloc(sizeof(WORD)); 	//h->next=NULL; 	h=NULL;     //p=h->next; 	if((fp=fopen("s.txt","r"))==NULL) 	{ 		printf("Can't open file"); 		return; 	} 	while(fscanf(fp,"%s",word)!=EOF) 	{  		//q=h->next; 		q=h; 		while(q!=NULL&&strcmp(q->w,word)) 			q=q->next; 		 		 		if(q!=NULL) 			q->count++; 		else{ 			q=(WORD*)malloc(sizeof(WORD)); 			strcpy(q->w,word); 			q->count=1; 			q->next=NULL; 			if(h==NULL)  { 				h=q; 			} else { 				p=h; 				while(p->next!=NULL) 					p=p->next; 				p->next = q; 			} 			wordcount++; 		} 	} 	 	/* p=h; 	while(p!=NULL) 	{ 	printf("%s  %d\n",p->w,p->count); 	p=p->next; } */ 	  	 	 	wordarr=(NEWWORD **)malloc(sizeof(NEWWORD*)*wordcount); 	     p=h;     while(p!=NULL) 	{ 		t = (NEWWORD *)malloc(sizeof(NEWWORD)); 		strcpy(t->words,p->w); 		t->counts=p->count; 		wordarr[i] = t; 		i++; 		p=p->next; 	} 	 	qsort(wordarr,wordcount,sizeof(NEWWORD*),cmp); 	for(i=0;i<wordcount;i++) 		printf("%s %d\n",wordarr[i]->words,wordarr[i]->counts);  } //这个是用qsort按排的，可是不知道怎么好像没用

user: user-1
content: 那你学排序（算法）了吗？

user: user-0
content: 可以帮我写写那个排序的程序么，我好好研究一下，我刚刚学链表，不怎么会用，求大神帮忙

user: user-1
content: 引用 5 楼 my_live_123 的回复:第一个结点没有挂到h->next上，然后随后的结点虽然都挂上了，但是头丢了！  你可以在插入的时候，就直接找到恰当位置插入，也就是说插入新结点就“排序”  引用 4 楼 u012027885 的回复:谢谢啊，我想把这些单词排序后再输出，怎么办？恩，边插入边排序最方便

user: user-1
content: 对于链表的排序，可以选用快速，插入，冒泡等，交换的时候交换结构体内的所有变量就行

user: user-3
content: 第一个结点没有挂到h->next上，然后随后的结点虽然都挂上了，但是头丢了！  你可以在插入的时候，就直接找到恰当位置插入，也就是说插入新结点就“排序”  引用 4 楼 u012027885 的回复:谢谢啊，我想把这些单词排序后再输出，怎么办？

user: user-0
content: 谢谢啊，我想把这些单词排序后再输出，怎么办？