c++用链表统计英文字母数一直不出结果

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

img

我把思路写在改的地方

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

我没进行空间释放,按你的思路改了一下。

img

应该是CreateLink函数那里,q只分配了一次空间,所以每次getchar读取输入后都存在了一个地方,覆盖了,最后读取字符,还是存在那里。所以直接就到字符了。应该每次循环都重新malloc分配一下空间。
然后最后统计完之后是不是应该把这些分配的空间都释放一下,
(不知道还有没有其他问题,