@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;
}
输出结果:
注意:使用链表存储字符串,其最后一个节点的数据域不一定会被字符串全部占满,对于这种情况,通常会用 ‘#’ 或其他特殊字符(能与字符串区分开就行)将最后一个节点填满。