问题描述】 输入n个字符建立单链表,删除表中重复元素并修改计数,实现单链表字符统计。 【输入形式】 输入一个整数n,表示要输入n个字符,后续输入n个字符,用逗号分隔。 【输出形式】 输出每个字符及个数,之间一个空格分隔,每个字符输出一行。 【样例输入】 5,a,b,c,a,b 【样例输出】 a 2 b 2 c 1
时间: 2023-05-25 08:00:48 浏览: 178
删除单链表的重复元素
4星 · 用户满意度95%
好的,让我来扮演ChitGPT,回答你的问题。
这是一个关于单链表字符统计的问题。根据输入,我们需要建立一个单链表,并删除其中的重复元素,同时统计每个字符的个数。
首先,我们需要定义一个单链表的结构体。每个节点需要记录字符以及出现次数,同时需要指向下一个节点。
```c
typedef struct Node {
char data; // 字符
int count; // 出现次数
struct Node* next; // 指向下一个节点
} Node, *LinkedList;
```
接下来,我们按照输入要求建立单链表。首先读入n,然后循环读入n个字符,将它们加入单链表。如果单链表中已经有该字符,则将该节点的计数加1。否则,创建一个新节点并插入到单链表中。
```c
int n;
scanf("%d", &n);
LinkedList head = NULL;
for (int i = 0; i < n; i++) {
char c;
scanf(" %c", &c);
Node* p = head;
Node* prev = NULL;
while (p != NULL && p->data != c) {
prev = p;
p = p->next;
}
if (p != NULL) {
// 已经有该字符
p->count++;
} else {
// 创建新节点
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = c;
newNode->count = 1;
newNode->next = NULL;
// 插入到单链表中
if (prev == NULL) {
head = newNode;
} else {
prev->next = newNode;
}
}
}
```
接下来,遍历单链表并输出每个节点的字符以及出现次数即可。
```c
Node* p = head;
while (p != NULL) {
printf("%c %d\n", p->data, p->count);
p = p->next;
}
```
完整代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
char data; // 字符
int count; // 出现次数
struct Node* next; // 指向下一个节点
} Node, *LinkedList;
int main() {
int n;
scanf("%d", &n);
LinkedList head = NULL;
for (int i = 0; i < n; i++) {
char c;
scanf(" %c", &c);
Node* p = head;
Node* prev = NULL;
while (p != NULL && p->data != c) {
prev = p;
p = p->next;
}
if (p != NULL) {
// 已经有该字符
p->count++;
} else {
// 创建新节点
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = c;
newNode->count = 1;
newNode->next = NULL;
// 插入到单链表中
if (prev == NULL) {
head = newNode;
} else {
prev->next = newNode;
}
}
}
Node* p = head;
while (p != NULL) {
printf("%c %d\n", p->data, p->count);
p = p->next;
}
return 0;
}
```
希望我的回答对你有所帮助,有什么其他问题,请继续提问。
阅读全文