串由零个或多个字符组成,说白了就是字符串。串的存储方式相对于线性表来讲有些不同,他分为以下几种:顺序存储、堆分配存储、链式存储。顺序存储通常在数组中的头元素存放字符串长度。堆分配存储通常会动态分配空间。链式存储分为两种,一种是每个节点存放一个字符(比较浪费空间),另一种则是每个节点存放多个字符,如果字符不是刚好,就用#代替。(c中字符串定义会有以下几种形式:字符串常量"hello",char数组char m[40] = "hello,world",char指针char *m = "hello,world"。字符串碰到‘\0’结束,定义的字符串末尾都会被系统添加‘\0’)这几种串的存储实现原理都一样,只是方式有些异同。以下是串的基本操作:

基本操作:

init(t , chars)

初始条件: chars是一个字符串常量。

操作结果:生成一个值为chars的串t。

connection(s, t)

初始条件:串s, t 已存在。

      操作结果:将串t联结到串s后形成新串存放到s中。

getLength(t)

初始条件:字符串t已存在。

操作结果:返回串t中的元素个数,称为串长。

SubString (s, pos, len, sub)

初始条件:串s, 已存在, 1≦pos≦StrLength(s)且 0≦len≦StrLength(s) –pos+1。

操作结果:用sub返回串s的第pos个字符起长度为len 的子串。

下面是串的链式存储代码实现:

#include #include //串的链式存储

typedef struct charNode{

char data;

struct charNode *next;

}charNode;

typedef charNode *charLink;

//c中字符串会有以下几种形式:字符串常量"hello",char数组char m[40] = "hello,world",char指针char *m = "hello,world"

void init(charLink *c,char s[]){

charLink p,q;

(*c)=(charLink)malloc(sizeof(charNode));//创建链式串

q=*c;//定义指针指向串

for(int i=0;s[i]!='\0';i++){//c里面所有定义的字符串后面都会有一个‘\0’,他代表结束

p=(charLink)malloc(sizeof(charNode));

p->data=s[i];//这里类似链表的尾插法

q->next=p;

q=p;

}

q->next=NULL;

}

//获取串长度

int getLength(charLink c){

int i=0;

charLink p;

p=c;

while(p->next){

p=p->next;

i++;

}

return i;

}

//将两个串拼成一个串

void connection(charLink *c,charLink b){

charLink p=(*c)->next;//定义一个指针指向c的第一个字符。

charLink p2=b;//定义一个指针指向b

charLink p3;//用来存储在b中取出的字符节点

char s;//用来存放从b中取出的字符数据

while(p2->next){//从b的第一个字符节点开始取

p2=p2->next;

s=p2->data;

while(p->next){//从c的第一个字符节点的next开始判断,如果不为空,就向下指,直到p成为c的最后一个字符节点

p=p->next;

}

p3=(charLink)malloc(sizeof(charNode));

p3->data=s;

p->next=p3;//类似链表的尾插法,让后插入的数据都往后排

p=p3;

}

p->next=NULL;

}

void substring(charLink c,int index,int slength,charLink *s){

//当index+slength<=(*s).length+1时才能取

charLink p,z;

*s=(charLink)malloc(sizeof(charNode));

z=*s;

p=c->next;

int i=1,j=1;

//拿到主串的要取数据的第一个位置

while(p->next&&inext;

i++;

}

//取值赋值

while(p&&j<=slength){

charLink n=(charLink)malloc(sizeof(charNode));

n->data=p->data;

z->next=n;

z=n;

p=p->next;

j++;

}

z->next=NULL;

}

void display(charLink c){

charLink p=c->next;

while(p){

char q=p->data;

printf("%c ",q);

p=p->next;

}

printf("\n");

}

int main()

{

charLink c,b,z;

char c1[20]="hello hello";

char c2[20]=" world world";

char c3[10]="";

init(&z,c3);

init(&c,c1);

display(c);

init(&b,c2);

display(b);

connection(&c,b);

display(c);

printf("串的长度为:\n%d\n",getLength(c));

substring(c,1,5,&z);

display(z);

return 0;

}

用c语言实现串的存储结构是指,数据结构学习笔记-串(C语言实现)相关推荐

  1. 数据结构学习笔记(c语言版)

    文章目录 一.概念 1.基本术语 2.算法 3.时间复杂度 4.数据的逻辑结构 二.线性表 1.存储结构 2.基本操作 三.栈 1.存储结构 2.基本操作 3.实际应用 四.队列 1.存储结构 2.基 ...

  2. Go:【学习笔记】Go 语言结构

    1 Go 语言结构 在我们开始学习 Go 编程语言的基础构建模块前,让我们先来了解 Go 语言最简单程序的结构. Go Hello World 实例: Go 语言的基础组成有以下几个部分: 包声明 引 ...

  3. MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-02

    MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-02 6. 锁 ​ 人们认为行级锁总会增加开销.实际上,只有当实现本身会增加开销时,行级锁才会增加开销.InnoDB 存储引擎不需要锁升级,因 ...

  4. 【学习笔记】C++语言程序设计(郑莉):数组、指针与字符串

    [学习笔记]C++语言程序设计(郑莉):数组.指针与字符串 1. 数组 1.1 数组的声明与使用 1.2 数组的存储与初始化 1.3 数组作为函数参数 1.4 对象数组 2. 指针 2.1 内存空间的 ...

  5. 中国大学MOOCPython语言程序设计(北京理工大学)第7-9周学习笔记和课后练习

    中国大学MOOCPython语言程序设计(北京理工大学)第7-9周学习笔记和课后练习 第7周 文件和数据格式化 7.1 文件的使用 7.2 实例11: 自动轨迹绘制 7.3 一维数据的格式化和处理 7 ...

  6. c语言注释语句执行吗,C语言学习笔记之C语言概念解析(附资料分享)每一个语句都必须以分号结尾但预处理命令函数头和花括号“}”之后不能加分号...

    [[怪兽爱C语言]C语言学习笔记之C语言概念解析(附资料分享)]https://toutiao.com/group/6582429294901854728/?iid=15906422033&a ...

  7. MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-01

    MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-01 1. MySQL体系结构和存储引擎 1.1 定义数据库和实例 数据库database: 物理操作系统文件或其他形式文件类型的集合. 当使 ...

  8. [UVMC]UVMC学习笔记之跨语言作用域的config操作

    UVMC学习笔记二 --- 跨语言作用域的config操作 前言:UVMC引入了特定的内存共享方法,可以在UVM/SystemVerilog与SystemC模块之间传递记名的半全局变量,在使用方式上类 ...

  9. Java快速入门学习笔记3 | Java语言中的表达式与操作符

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

最新文章

  1. Kubernetes学习笔记二:Namespace,Cgroups 的隔离与应用
  2. php.ini 延迟,php超时报错Maximum execution time of 120 seconds exceeded in解决办法
  3. 初面蚂蚁金服,java微积分第三方计算包
  4. Caffe官方教程翻译(8):Brewing Logistic Regression then Going Deeper
  5. 学习区块链,绕不过去的“拜占庭将军问题”!!这里正好有通俗易懂的解释
  6. redis和kafka读取代码
  7. 使用“牛顿迭代法”求解方程
  8. iOS多线程(一):GCD的基本使用
  9. Android源码:1、如何下载源码详解(一)
  10. Java 基本数据类型(四类八种)
  11. unity商店的Standard Assets自带人物移动插件的bug修改
  12. MIPI DSI的linux kernel驱动原理 | 基于RK3399
  13. Win10 chm文件无法打开解决方案
  14. 用php获取设备信息
  15. X Chen笔记---百度云破解限速
  16. FRP搭建内网穿透(亲测有效)
  17. Output输出缓存区大小只有1024KB,超过大小限制的就会被清除
  18. C/C++结构体内存对齐问题
  19. 中国一汽发布L4级智能驾驶技术,解放商用车率先使用;科大讯飞今日将发翻译机2.0版本;阿里巴巴已以50亿控股全球第二大WiFi芯片商乐鑫信息科技
  20. STM32之引脚GPIO

热门文章

  1. 再见了微服务!全面拥抱 DDD 真正的价值
  2. 【专题介绍】开源与创新
  3. LiveVideoStack 2021招聘季
  4. 若只让我推荐一名LiveVideoStackCon上海的讲师,就是他
  5. Java多线程之线程池详解
  6. 视频直播:实时数据可视化分析
  7. 我不是码神!Serverless真的可以为所欲为?
  8. 腾讯发布2017年代码报告
  9. Linux awk 命令
  10. Hyperledger Fabric 1.0发布:基于区块链的开源分布式账本