单链表的基本操作与排序

本文探讨如何使用单链表处理字符串,统计各字母出现次数并按自然顺序排序。首先分析题目,确定使用链表遍历字符串,接着详细讲解链表遍历和排序的实现,包括冒泡排序的链表应用。最后给出完整代码并提及其他更简单的解决方案。
摘要由CSDN通过智能技术生成

统计字符串中各字母出现的次数,并按照规定格式和 自然顺序 输出给定字符串。如:输入”asdfdfdassssddf” ,输出:a:2 d:5 f:3 s:5 。

题目的层次分析

分析题目可得,目标程序需要实现字符串的输入、遍历、排序、输出四项基本操作。其中字符串的输入与输出都很基础,则重心放在遍历与排序上。

字符串的遍历

在给定字符串进行遍历的情况下,我们有两个选择进行遍历:数组与链表。但链表更容易实现动态插入,所以在这个题目中我们选择用链表来实现其操作。

定义结构体,分别存放字母和频次用以输出。在遍历时,第一次检测到某个字母时将其插入链表,同时令其频次+1,之后的遍历也在此基础上进行。
其中字母的抓取就是单纯的对字符串进行遍历,根据字母出现的先后顺序构建链表。
代码如下:

struct Node *getNodeByKey(char key)
{
    struct Node *node;
    node = list_head;
    while (node != NULL) {
        if (node->data.key == key)
            return node;
        node = node->next;
    }
    return NULL;
}

void insert(char key)
{
    struct Node *node = (Node*)malloc(sizeof(struct Node));
    node->data.key = key;
    node->data.num = 1;
    node->next = NULL;

    if (list_head == NULL) {
        list_head = node;
    }

    if (list_tail == NULL) {
        list_tail = node;
    }
    else {
        list_tail->next = node;
        list_tail = node;
    }
}

链表的排序

排序是此题中的一个难点。最终选择的方法是冒泡排序,来实现顺序输出。
基本思想:改变链表指针的指向,字符两两进行比较(ASCLL码),将较大的一方“冒”到最后,和数组的冒泡排序基本方法类似,只是过程稍稍麻烦一些。指针的指向很容易搞错,是其中很需要注意的一个问题。
建立四个指针,分别是current,prevent,temporary,last,我们通过这四个指针来改变链表的顺序。
current和prevent开始时都指向头结点(prevent作为current的父结点,指向其前一个位置),temporary用来作为缓存位置记录指针指向,last则是指向尾结点。
需要注意的是在交换结束时我们还需要注意让prevent和current的重新指回头结点。
尾结点和头结点都是循环中非常需要重要的部分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值