串块链存储表示的创建块链和遍历输出

文章介绍了一种利用链块结构存储字符串的方法,其中每个节点可以是一个字符或多个字符的块。在创建链块时,会根据给定字符串的长度动态分配节点,并用尾插法构建链表。遍历输出函数则按顺序打印非空字符。代码示例展示了如何创建和打印一个块链字符串。
摘要由CSDN通过智能技术生成

由于串的特殊性(每个元素只有一个字符),在具体实现时,每个结点既可以存放一个字符,也可以存放多个字符。每个结点称为块,整个链表称为链块结构

typedef struct StringNode
{
  char ch[3];
  struct StringNode *next;
}

存储密度低:

typedef struct StringNode
{
  char ch;//每个结点有一个字符
  struct StringNode *next;//指针占据3B
}

 1.创建块链

//生成一个其值等于chars的串T(要求chars中不包含填补空余的字符)
void List_BLString(BLString &T,char *chars)
{
  int i;//用来表示串chars的长度
  i = strlen(chars);
  if(i == 0 || strchr(chars,blank))//strchr表示在字符串chars中查找blank.如果字符串为0或者包含blank不符合条件
	  exit(-1);
  T.length = i;
  int j;//j表示块链的长度
  j = i/BlockSize;//向下取整
  if(i%BlockSize != 0)
	  j = j+1;
  int k;
  int n = *(chars+i-1);//表示的是字符串最后一个元素的地址
  for(k = 0; k <= j; ++k)
  {
    BString *p = (BString *)malloc(sizeof(BString));
	if(p == NULL)
	{
	  printf("动态内存分配失败,结束程序!\n");
	  exit(-1);
	}
	//使用尾插法来创建块链
	if(k == 0)
	{
		T.Head = p;
		T.Tail = p;
		T.Tail->next = NULL;
	}
	if(k != 0)
	{
		T.Tail->next = p;
		p->next = NULL;
		T.Tail = p;

	}
	for(int m = 0; m < BlockSize; ++m)
	{
		*(p->ch+m) = *chars++;//结束某一块循环之后p就变成指向另一个块的地址,所以该循环仍然成立
		if(n == *(chars-1) && m < BlockSize)//因为是*chars++,所以达到字符串最后一个元素地址之后还会加1,所以条件应该是n == *(chars-1),此时正好两个都是字符串的最后一个元素的地址
		{
		  for(m = m+1; m < BlockSize; ++m)
		  {
			  *(p->ch+m) = blank;
		  }
		}
	}
  }
}

2.遍历输出

//遍历输出
void BLStringprint(BLString &T)
{
	if(T.length == 0)
		printf("串为空!\n");
	else
	{
		BString *p = T.Head;
		int i = 0;
		while(i < T.length)
		{
		  for(int j = 0; j < BlockSize; ++j)
		  {
			  if(*(p->ch+j) != blank)
			  {
				  printf("%c",*(p->ch+j));
				  i++;
			  }
		  }
		  p = p->next;
		}
	}
}

3.运行结果:

这两个函数运行的完整代码

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#define BlockSize 4//定义块的大小
//定义块链中块的结构体
typedef struct BString
{
  char ch[BlockSize];//块中的数据域
  BString *next;
}BString;

//定义块链
typedef struct BLString
{
  BString *Head,*Tail;//块链的头指针与尾指针
  int length;//当前串的长度
}BLString;

char blank = '#';


//函数说明
void InitBLString(BLString &T);
void List_BLString(BLString &T,char *chars);
void BLStringprint(BLString &T);
int main(void)
{
  BLString L;
  InitBLString(L);
  List_BLString(L,"abcdefghijklmn");
  BLStringprint(L);
  return 0;
}

//初始化块链
void InitBLString(BLString &T)
{
	T.Head = NULL;
	T.Tail = NULL;
	T.length = 0;
}

//生成一个其值等于chars的串T(要求chars中不包含填补空余的字符)
void List_BLString(BLString &T,char *chars)
{
  int i;//用来表示串chars的长度
  i = strlen(chars);
  if(i == 0 || strchr(chars,blank))//strchr表示在字符串chars中查找blank.如果字符串为0或者包含blank不符合条件
	  exit(-1);
  T.length = i;
  int j;//j表示块链的长度
  j = i/BlockSize;//向下取整
  if(i%BlockSize != 0)
	  j = j+1;
  int k;
  int n = *(chars+i-1);//表示的是字符串最后一个元素的地址
  for(k = 0; k <= j; ++k)
  {
    BString *p = (BString *)malloc(sizeof(BString));
	if(p == NULL)
	{
	  printf("动态内存分配失败,结束程序!\n");
	  exit(-1);
	}
	//使用尾插法来创建块链
	if(k == 0)
	{
		T.Head = p;
		T.Tail = p;
		T.Tail->next = NULL;
	}
	if(k != 0)
	{
		T.Tail->next = p;
		p->next = NULL;
		T.Tail = p;

	}
	for(int m = 0; m < BlockSize; ++m)
	{
		*(p->ch+m) = *chars++;//结束某一块循环之后p就变成指向另一个块的地址,所以该循环仍然成立
		if(n == *(chars-1) && m < BlockSize)//因为是*chars++,所以达到字符串最后一个元素地址之后还会加1,所以条件应该是n == *(chars-1),此时正好两个都是字符串的最后一个元素的地址
		{
		  for(m = m+1; m < BlockSize; ++m)
		  {
			  *(p->ch+m) = blank;
		  }
		}
	}
  }
}


//遍历输出
void BLStringprint(BLString &T)
{
	if(T.length == 0)
		printf("串为空!\n");
	else
	{
		BString *p = T.Head;
		int i = 0;
		while(i < T.length)
		{
		  for(int j = 0; j < BlockSize; ++j)
		  {
			  if(*(p->ch+j) != blank)
			  {
				  printf("%c",*(p->ch+j));
				  i++;
			  }
		  }
		  p = p->next;
		}
	}
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值