//输出单链表中字符及个数 void PrintList(LinkList L)
时间: 2023-05-22 17:07:21 浏览: 174
好的,我会扮演 ChitGPT,以下是回答:
要输出单链表中字符及个数,你需要遍历整个链表并统计每个字符的出现次数。下面是一个实现的例子:
```
void PrintList(LinkList L) {
int count[256] = {0}; // 初始化数组用于统计每个字符出现的次数
LinkList p = L->next; // 从头节点的指针域开始遍历
while (p != NULL) {
count[p->data]++; // 统计该字符出现的次数
p = p->next; // 指针域指向下一个节点
}
for (int i = 0; i < 256; i++) {
if (count[i] > 0) {
printf("'%c': %d\n", i, count[i]); // 输出该字符及其出现次数
}
}
}
```
这个函数统计了单链表中所有字符的出现次数,并输出了每个字符及其出现次数。注意,这里默认单链表中只包含 ASCII 码中的可打印字符。如果需要支持 Unicode 等更复杂的字符集,需要对代码进行相应的修改。
相关问题
一、使用记事本创建一个文本文件,命名为aa.dat,其中存放用空格或回车分隔的若干整数。 ① 设计函数,从aa.dat中读取全部整数,并以链表方式存放。 ② 设计函数,将链表中所有结点按结点值升序排列。 ③ 设计函数int insert_L(LinkList h, int x); 将x插入在已经有序的链表中,使链表依然有序,并通过函数值返回插入位置(插入后是链表中的第几个结点) ④ 设计函数void endToEnd(LinkList h,char *s);将升序的整型链表所有结点的结点值首尾相连组合成字符串s。若结点值分别为12,3456,7890,123,连接后的字符串为1234567890123。连接时去掉前导0,若结点值为0,12,345,连接后的字符串为12345;若结点值为0,0,0,连接后的字符串为0 ⑤ 设计函数void split(char *s,int a[]);将④得到的字符串一位一位的逆序拆分在整型数组a中,a[0]存放数字位数,a[1]存放最后一个字符,依次类推... ⑥ 设计函数:将③得到的链表中的结点值,依次存放在文本文件bb.dat中。 在main函数中依次调用上述函数,测试功能能否实现。
以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node {
int data;
struct Node *next;
} Node, *LinkList;
void printList(LinkList head) { // 打印链表
Node *p = head->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void destroyList(LinkList head) { // 销毁链表
Node *p = head;
while (p != NULL) {
Node *temp = p;
p = p->next;
free(temp);
}
}
LinkList createListFromFile(const char *filename) { // 从文件中读取整数创建链表
FILE *fp = fopen(filename, "r");
if (fp == NULL) {
printf("Failed to open file %s.\n", filename);
return NULL;
}
LinkList head = (Node *)malloc(sizeof(Node));
head->next = NULL;
Node *tail = head;
int num;
while (fscanf(fp, "%d", &num) != EOF) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = num;
newNode->next = NULL;
tail->next = newNode;
tail = newNode;
}
fclose(fp);
return head;
}
void sortList(LinkList head) { // 排序链表
Node *p = head->next;
head->next = NULL;
while (p != NULL) {
Node *q = p->next;
Node *prev = head;
while (prev->next != NULL && prev->next->data < p->data) {
prev = prev->next;
}
p->next = prev->next;
prev->next = p;
p = q;
}
}
int insert_L(LinkList head, int x) { // 将x插入链表,返回插入位置
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = x;
newNode->next = NULL;
Node *p = head->next;
int position = 0;
while (p != NULL && p->data < x) {
position++;
p = p->next;
}
newNode->next = p;
head->next = newNode;
return position + 1;
}
void endToEnd(LinkList head, char *s) { // 将链表中的数字首尾相连组合成字符串
Node *p = head->next;
int len = 0;
while (p != NULL) {
sprintf(s + len, "%d", p->data);
len += strlen(s + len);
p = p->next;
}
int i = 0, j = len - 1;
while (i < j) {
char temp = s[i];
s[i] = s[j];
s[j] = temp;
i++;
j--;
}
}
void split(char *s, int a[]) { // 拆分字符串
a[0] = strlen(s);
for (int i = 1; i <= a[0]; i++) {
a[i] = s[a[0] - i] - '0';
}
}
void saveListToFile(LinkList head, const char *filename) { // 将链表中的数字存入文件
FILE *fp = fopen(filename, "w");
if (fp == NULL) {
printf("Failed to open file %s.\n", filename);
return;
}
Node *p = head->next;
while (p != NULL) {
fprintf(fp, "%d ", p->data);
p = p->next;
}
fclose(fp);
}
int main() {
LinkList head = createListFromFile("aa.dat");
if (head == NULL) {
return 0;
}
printList(head);
sortList(head);
printList(head);
int position = insert_L(head, 5);
printList(head);
printf("Insert position: %d\n", position);
char s[100];
endToEnd(head, s);
printf("String: %s\n", s);
int a[100];
split(s, a);
printf("Array:");
for (int i = 1; i <= a[0]; i++) {
printf(" %d", a[i]);
}
printf("\n");
saveListToFile(head, "bb.dat");
destroyList(head);
return 0;
}
```
c语言建立长度为n的单链表A和长度为m的单链表B,n>0,m>0。编程实现将B表链接在A表的尾端,形成一个单链表A。数据类型指定为字符型。 输入格式: 第一行为A表的长度n; 第二行为A表中的数据元素; 第三行为B表的长度m; 第四行为B表中的数据元素。 输出格式: 输出为链接好后的A表中的所有数据元素。
以下是使用C语言实现将B表链接在A表尾端的代码:
```c
#include <stdio.h>
#include <stdlib.h>
//定义节点结构体
typedef struct node{
char data; //数据元素类型为字符型
struct node *next; //指向下一个节点的指针
}Node;
//创建链表函数
Node *createList(int n){
Node *head, *p, *q;
head = (Node *)malloc(sizeof(Node)); //创建头结点
q = head; //q指向头结点
for(int i=0; i<n; i++){
p = (Node *)malloc(sizeof(Node)); //创建新节点
scanf(" %c", &p->data); //输入节点数据
q->next = p; //将新节点连接到链表尾部
q = p; //q指向新节点,继续循环
}
q->next = NULL; //链表尾部置空
return head; //返回头结点
}
//输出链表函数
void printList(Node *head){
Node *p = head->next; //p指向第一个节点
while(p){
printf("%c ", p->data); //输出节点数据
p = p->next; //指向下一个节点
}
printf("\n");
}
//链接两个链表函数
void linkList(Node *A, Node *B){
Node *p = A;
while(p->next){ //找到A链表尾部
p = p->next;
}
p->next = B->next; //将B链表连接到A链表尾部
free(B); //释放B链表的头结点
}
int main()
{
int n, m;
printf("Please enter the length of A list: ");
scanf("%d", &n);
printf("Please enter %d elements for A list: ", n);
Node *A = createList(n); //创建A链表
printf("Please enter the length of B list: ");
scanf("%d", &m);
printf("Please enter %d elements for B list: ", m);
Node *B = createList(m); //创建B链表
linkList(A, B); //链接A和B链表
printf("Linked list: ");
printList(A); //输出链接好后的A链表
return 0;
}
```
样例输入:
```
Please enter the length of A list: 4
Please enter 4 elements for A list: a b c d
Please enter the length of B list: 3
Please enter 3 elements for B list: e f g
```
样例输出:
```
Linked list: a b c d e f g
```
阅读全文