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

@Adrian

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

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

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

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

#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;
}

输出结果:

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

你可能感兴趣的:(数据结构)