# include<stdio.h>
# include<stdlib.h>
# include<string.h>
#define ERROR 0
#define OK 1
#include <ctype.h>
typedef int ElemType;
typedef char DataType;
//定义节点
typedef struct LNode{
DataType data;
struct LNode *next;
}LNode,*LinkList;
//初始化
int Init_List(LinkList &L) {
L=(LinkList)malloc(sizeof(LNode)); //L=new(LNode) 相同写法
L->next=NULL;
}
//写入文章,文章入链表
void CreateLink(LinkList &L){
printf("\n请输入文章:\n");
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
LNode *p = L;
int i;
LNode *q = (LinkList)malloc(sizeof(LNode));
while((q->data=getchar())!='*'){
q->next =p->next;
p->next = q;
p=q;
}
p->next = NULL;
}
//统计链表中英文字母个数及空格数
void CountNum(LinkList L){
LNode *p=new(LNode);
char ch;
int m=0,n=0,k=0; //m,n分别为 英文字母个数及空格数
p=L;
// printf("ok");
while(p->data!='*'){
ch=p->data;
if(isalpha(ch)){ //统计英文字母数
m++;
}
else
if(isdigit(ch)){ //统计数字
n++;
}
else
if(isspace(ch)){ //统计空格数
k++;
}
p=p->next;
printf("ok");
}
printf("\n文章中英文字母数为:%d\n",m);
printf("数字个数为:%d\n",k);
printf("空格数为:%d\n",n);
}
int main(){
LinkList L;
Init_List(L);
CreateLink(L);
CountNum(L);
我把思路写在改的地方
# include<stdio.h>
# include<stdlib.h>
# include<string.h>
#define ERROR 0
#define OK 1
#include <ctype.h>
typedef int ElemType;
typedef char DataType;
//定义节点
typedef struct LNode {
DataType data;
struct LNode* next;
}LNode, * LinkList;
//初始化
int Init_List(LinkList& L) {
L = (LinkList)malloc(sizeof(LNode)); //L=new(LNode) 相同写法
L -> next= NULL;
L->data = 0;//不放值的话会产生随机值
return 0;
}
//写入文章,文章入链表
void CreateLink(LinkList& L) {
printf("\n请输入文章:\n");
//已经初始化过了,不需要在为L开辟空间
LNode* p = L;
int i;
while ((i = getchar()) != '*') {
LNode* q = (LinkList)malloc(sizeof(LNode));
q->next = NULL;
q->data = i;
p->next = q;//把节点链接到L链表上
p = p->next;//需要p节点向后移动
}
LNode* q = (LinkList)malloc(sizeof(LNode));// 最后*没链接到链表上,在开辟空间进行链接
q->next = NULL;
q->data = '*';
p->next = q;
}
//统计链表中英文字母个数及空格数
void CountNum(LinkList &L) {
LNode* p = L;
char ch;
int m = 0, n = 0, k = 0; //m,n分别为 英文字母个数及空格数
p = L->next;//L的第一个节点不是我们所要的节点,我们所用的节点从第二个开始
// printf("ok");
while (p->data != '*') {
ch = p->data;
if (isalpha(ch)) { //统计英文字母数
m++;
}
else
if (isdigit(ch)) { //统计数字
n++;
}
else
if (isspace(ch)) { //统计空格数
k++;
}
p = p->next;
printf("ok");
}
printf("\n文章中英文字母数为:%d\n", m);
printf("数字个数为:%d\n", n);//你的n和k写反了
printf("空格数为:%d\n", k);
}
int main() {
LinkList L;
Init_List(L);
CreateLink(L);
CountNum(L);
}
我没进行空间释放,按你的思路改了一下。
应该是CreateLink函数那里,q只分配了一次空间,所以每次getchar读取输入后都存在了一个地方,覆盖了,最后读取字符,还是存在那里。所以直接就到字符了。应该每次循环都重新malloc分配一下空间。
然后最后统计完之后是不是应该把这些分配的空间都释放一下,
(不知道还有没有其他问题,