如何用链表统计字符串中字符的出现次数?
没问题,我来帮你搞定这个字符统计的链表实现!咱们一步步来完善代码:
字符统计链表的完整解决方案
我们需要完成两个核心函数: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
相关产品推荐
相关产品推荐

