字符串---串的块链存储结构

@Adrian

串的块链存储,指的是使用链表结构存储字符串。

我们知道,单链表中的 “单” 强调的仅仅是链表各个节点只能有一个指针,并没有限制数据域中存储数据的具体个数。因此在设计链表节点的结构时,可以令各节点存储多个数据。

该链表各个节点中可存储 1 个字符:
在这里插入图片描述
设置的链表各节点可存储 4 个字符:
在这里插入图片描述
链表各节点存储数据个数的多少可参考以下几个因素:

		1、串的长度和存储空间的大小:若串包含数据量很大,且链表申请的存储空间有限,
		此时应尽可能的让各节点存储更多的数据,提高空间的利用率(每多一个节点,就要
		多申请一个指针域的空间);反之,如果串不是特别长,或者存储空间足够,就需要
		再结合其他因素综合考虑;
		2、程序实现的功能:如果实际场景中需要对存储的串做大量的插入或删除操作,则
		应尽可能减少各节点存储数据的数量;反之,就需要再结合其他因素。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define linkNum 3 //全局设置链表中节点存储数据的个数

typedef struct Link{
    char a[linkNum];//数据域可存放linkNum个数据
    struct Link*next;//代表指针域,指向直接的后继元素
}link;

//初始化链表,其中head为头指针,str为存储的字符串
link * initLink(link*head,char*str){
    int length = strlen(str);
    //根据字符串的长度,计算出链表中使用节点的个数
    int num = length/linkNum;
    if(length%linkNum){
        num++;
    }
    //创建并初始化首元节点
    head=(link*)malloc(sizeof(link));
    head->next = NULL;
    link*temp = head;
    //初始化链表
    for(int i = 0;i < num;i++){
        int j = 0;
        for(;j<linkNum;j++){
            if(i*linkNum + j<length){
                temp->a[j] = str[i*linkNum+j];
            }else
                temp->a[j]='#';
        }
            if(i*linkNum + j < length){
                link * newlink = (link*)malloc(sizeof(link));
                newlink->next = NULL;
                temp->next = newlink;
                temp = newlink;
            }
        }
        return head;
}

//输出链表
void displayLink(link * head){
    link*temp = head;
    while(temp){
        for(int i=0;i < linkNum;i++){
            printf("%c",temp->a[i]);
        }
        temp = temp->next;
    }
}
int main()
{
    link * head = NULL;
    head = initLink(head, "HelloWorld");
    displayLink(head);
    printf("\n============================\n");
    head = initLink(head, "HelloWorldoo");
    displayLink(head);
    return 0;
}

输出结果:

在这里插入图片描述注意:使用链表存储字符串,其最后一个节点的数据域不一定会被字符串全部占满,对于这种情况,通常会用 ‘#’ 或其他特殊字符(能与字符串区分开就行)将最后一个节点填满。

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值