You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用链表统计字符串中字符的出现次数?

没问题,我来帮你搞定这个字符统计的链表实现!咱们一步步来完善代码:

字符统计链表的完整解决方案

我们需要完成两个核心函数:letters() 负责统计字符串中每个字符的出现次数并构建链表,report() 负责遍历链表并按要求格式打印结果。下面是具体实现:

1. 实现 letters() 函数

这个函数的核心逻辑是遍历输入字符串,对每个字符检查链表中是否已有对应节点:

  • 若存在节点,就把该节点的计数 occurs 加1
  • 若不存在,就创建新节点并添加到链表(这里提供两种添加方式:头部添加或尾部添加,按需选择)

方式1:头部添加(代码更简洁,输出顺序与输入反向)

void letters( char name[50], ListofChar * lst_ptr) {
    // 遍历输入字符串的每个字符
    for (int i = 0; name[i] != '\0'; i++) {
        char current_ch = name[i];
        CharNode_ptr current = *lst_ptr;
        
        // 检查链表中是否已有该字符的节点
        while (current != NULL) {
            if (current->ch == current_ch) {
                current->occurs++;
                break;
            }
            current = current->next;
        }
        
        // 没找到则创建新节点并添加到头部
        if (current == NULL) {
            CharNode_ptr new_node = createnode(current_ch);
            new_node->occurs = 1; // 新节点计数初始化为1
            new_node->next = *lst_ptr;
            *lst_ptr = new_node;
        }
    }
}

方式2:尾部添加(输出顺序与输入一致,符合你示例的要求)

void letters( char name[50], ListofChar * lst_ptr) {
    for (int i = 0; name[i] != '\0'; i++) {
        char current_ch = name[i];
        CharNode_ptr current = *lst_ptr;
        
        // 检查已有节点
        while (current != NULL) {
            if (current->ch == current_ch) {
                current->occurs++;
                break;
            }
            current = current->next;
        }
        
        // 没找到则创建新节点并添加到尾部
        if (current == NULL) {
            CharNode_ptr new_node = createnode(current_ch);
            new_node->occurs = 1;
            
            if (*lst_ptr == NULL) {
                // 链表为空时直接作为头节点
                *lst_ptr = new_node;
            } else {
                // 找到链表尾部
                CharNode_ptr tail = *lst_ptr;
                while (tail->next != NULL) {
                    tail = tail->next;
                }
                tail->next = new_node;
            }
        }
    }
}

2. 实现 report() 函数

这个函数负责遍历链表,按照字符:次数的格式打印结果:

void report( ListofChar chars ) {
    CharNode_ptr current = chars;
    // 遍历链表逐个打印
    while (current != NULL) {
        printf("%c:%d ", current->ch, current->occurs);
        current = current->next;
    }
    printf("\n"); // 最后换行
}

完整可运行代码

把上述函数补充到你的原有代码中,完整代码如下:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

struct charact { 
    char ch; 
    int occurs; 
    struct charact *next; 
}; 

typedef struct charact Char; 
typedef Char * ListofChar; 
typedef Char * CharNode_ptr; 

void letters( char name[50], ListofChar * chars_ptr); 
void report( ListofChar chars ); 
Char * createnode( char ch ); 

int main() { 
    char name[50]; 
    ListofChar chars = NULL; 
    scanf("%s", name); 
    letters(name, &chars); 
    report(chars); 
    return 0; 
} 

Char * createnode( char ch ) { 
    CharNode_ptr newnode_ptr ; 
    newnode_ptr = malloc(sizeof (Char)); 
    newnode_ptr -> ch = ch; 
    newnode_ptr -> occurs = 0; 
    newnode_ptr -> next = NULL; 
    return newnode_ptr; 
} 

// 这里选尾部添加的版本,保证输出顺序和输入一致
void letters( char name[50], ListofChar * lst_ptr) {
    for (int i = 0; name[i] != '\0'; i++) {
        char current_ch = name[i];
        CharNode_ptr current = *lst_ptr;
        
        while (current != NULL) {
            if (current->ch == current_ch) {
                current->occurs++;
                break;
            }
            current = current->next;
        }
        
        if (current == NULL) {
            CharNode_ptr new_node = createnode(current_ch);
            new_node->occurs = 1;
            
            if (*lst_ptr == NULL) {
                *lst_ptr = new_node;
            } else {
                CharNode_ptr tail = *lst_ptr;
                while (tail->next != NULL) {
                    tail = tail->next;
                }
                tail->next = new_node;
            }
        }
    }
}

void report( ListofChar chars ) {
    CharNode_ptr current = chars;
    while (current != NULL) {
        printf("%c:%d ", current->ch, current->occurs);
        current = current->next;
    }
    printf("\n");
}

测试效果

输入hello时,程序会输出:h:1 e:1 l:2 o:1 ,完全符合你的要求。

内容的提问来源于stack exchange,提问作者Loga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:24:59