// 串的定长顺序存储实现.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include

#include

#include

#include

#define STRING_SIZE 255

using namespace std;

typedef unsigned char SString[STRING_SIZE + 1];

//函数声明部分

void Error(char *s); //错误处理函数

void Strassign_string(SString &S, char chars[]); //赋值函数

void Clear_string(SString &s); //清空函数

void Destroy_string(SString &S); //销毁函数

int Getlength_string(SString &s); //得到定长顺序串的长度

int Compare_string(SString &s, SString &t); //比较两个订场顺序串的大小

void Concat_string(SString &t, SString &s1, SString &s2); //连接两个顺序串

void Substring_string(SString &sub, SString &s, int pos, int len); //得到主串的子串

void Insert_string(SString &S, SString &T, int pos); //插入函数

void Delete_string(SString &S, int t, int pos); //删除函数

//函数实现部分

void Error(char *s) //错误处理函数

{

cout << s << endl;

exit(1);

}

/*赋值算法设计:1、先计算待赋值顺序串的长度;2.如果待赋值字符串的长度为0,则将主串设置为空串

3.在待赋值字符串长度不为零的情况下,如果长度大于申请的空间,将发生截断现象,给出截断提示

如果长度小于等于申请的空间,不发生截断现象*/

void Strassign_string(SString &S, char chars[]) //赋值函数

{

int i = 0;

int chars_length = 0; //初始值设为0

while (chars[i] != '\0') //计算待赋值串的长度

{

chars_length++;

i++;

}

if (!chars_length) S[0] = 0;

else

{

int j = 1;

int k = 0;

if (chars_length > STRING_SIZE)

{

while(j<=STRING_SIZE)

{

S[j++] = chars[k++];

}

S[0] = STRING_SIZE;

cout << "串常量长度大于给定空间,赋值发生截断!" << endl;

}

else

{

while (j <= chars_length)

{

S[j++] = chars[k++];

}

S[0] = chars_length;

}

}

}

void Clear_string(SString &s) //清空函数

{

s[0] = 0;

}

void Destroy_string(SString &S) //销毁函数

{

for (int i = 1; i <= S[0]; i++)

{

delete &S[i];

}

delete &S[0];

}

int Getlength_string(SString &s) //得到定长顺序串的长度

{

return s[0];

}

/*定长顺序串的大小比较算法设计:以此比较串1和串1对应位置上的字符

1.如果串1大于串2,返回正数;2.如果串1等于串2,返回0;3,如果串1小于串2,返回负数*/

int Compare_string(SString &s, SString &t) //比较两个定长顺序串的大小

{

for (int i = 1; (i <= s[0]) && (i <= t[0]); i++)

{

if (s[i] != t[i])

return (s[i] - t[i]);

else

return (s[0] - t[0]);

}

}

/*连接两个定长顺序串的算法设计:基于定产顺序串S1和S2的连接操作,对超过预定义空间的部分需要实施截断操作。

基于S1和s2长度的不同,连接时可能有以下四种情况:

1.S1[0]+S2[0]<=STRING_SIZE,则得到的串是正确的串;

2.S1[0]+S2[0]>STRING_SIZE,且S1[0]

3.S1[0]=STRING_SIZE,则得到的串是S1串;

4.S1[0]>STRING_SIZE,则得到的串是S1的部分,S1将发生截断;*/

void Concat_string(SString &t, SString &s1, SString &s2)//连接两个顺序串

{

if ((s1[0] + s1[0]) <= STRING_SIZE)

{

int j = 1;

int k = 1;

while (j <= s1[0])

{

t[k++] = s1[j++];

}

j = 1;

while (j <= s2[0])

{

t[k++] = s2[j++];

}

t[0] = s1[0] + s2[0];

cout << "正确连接,没有发生截断!" << endl;

}

else if ((s1[0]) <= STRING_SIZE)

{

int j = 1;

int k = 1;

while (j <= s1[0])

{

t[k++] = s1[j++];

}

j = 1;

while (j <= s2[0])

{

t[k++] = s1[j++];

}

t[0] = STRING_SIZE;

cout << "未正确连接,S2发生截断!" << endl;

}

else if ((s1[0])== STRING_SIZE)

{

int j = 1;

int k = 1;

while (j <= s1[0])

{

t[k++] = s1[j++];

}

t[0] = STRING_SIZE;

cout << "未正确连接,S2没有连接上!" << endl;

}

else

{

int j = 1;

int k = 1;

while (j <= s1[0])

{

t[k++] = s1[j++];

}

t[0] = s1[0];

cout << "未正确连接,S1发生截断现象!" << endl;

}

}

void Substring_string(SString &sub, SString &s, int pos, int len) //得到主串的子串

{

if ((pos<1) || (pos>s[0]) || (len < 0) || (len>(s[0] - pos + 1)))

Error("参数输入错误,请再次输入!");

for (int i = 1; i <= len; i++)

{

sub[i] = s[pos + i - 1];

}

sub[0] = len;

}

void Insert_string(SString &S, SString &T, int pos)//将子串插入到主串pos位置后

{

if ((S[0] + T[0]) <= STRING_SIZE)

{

int j = 0;

for (int i = (S[0]+T[0]); i >= pos; i--) //将主串从后往前移动,腾出子串的位置

{

S[i] = S[S[0] - j];

j++;

}

j = 1;

for (int i = pos; i < (pos + T[0]); i++) //将子串插入到pos位置起的部分

{

S[i] = T[j];

j++;

}

S[0] = S[0] + T[0];

}

}

void Delete_string(SString &S, int t, int pos) //从主串中pos位置起删除t个字符

{

for (int i = pos; i < (S[0] - pos + 1); i++)

{

S[i] = S[i+t];

}

S[0] = S[0] - t;

}

int _tmain(int argc, _TCHAR* argv[])

{

char a[50] = { "abc" };

SString S1;

Strassign_string(S1, a);

cout << "串S1的长度是:" << Getlength_string(S1) << endl;

char b[50] = { "ABCDEFGHIJKLMN"};

SString S2;

Strassign_string(S2, b);

cout << "串S2的长度是:" << Getlength_string(S2) << endl;

cout << "比较字符串的结果是:" << Compare_string(S1, S2) << endl;

Insert_string(S2, S1, 3);

cout << "插入后的字符串是:";

for (int i = 1; i <= S2[0]; i++)

{

cout << S2[i];

}

cout << endl;

Delete_string(S2, 3, 2);

cout << "删除后的字符串是:";

for (int i = 1; i <= S2[0]; i++)

{

cout << S2[i];

}

cout << endl;

SString S3;

Concat_string(S3, S1, S2);

cout<

cout << "连接后的字符串是:";

for (int i = 1; i <= S3[0]; i++)

{

cout << S3[i];

}

cout << endl;

SString S4;

Substring_string(S4, S3, 3, 5);

cout << "取出的子串是:";

for (int i = 1; i <= S4[0]; i++)

{

cout << S4[i];

}

cout << endl;

return 0;

}

c语言实现定长顺序存储,c语言:定长顺序串的基本操作实实现相关推荐

  1. 数据结构之顺序串的基本操作(C语言)

    ----------------------✨

  2. 串的定长顺序存储结构|C++实现

    数据结构里的串,是一种简单的线性表 一系列相连的字符就形成了字符串 空串不含有任何字符 空格也是字符 对照ASCII码 子串必须是一个串中连续字符组成的,哪怕所有元素都是一个串中的,但是不连续也不是子 ...

  3. 按键连续点击的c语言程序,长按键C语言程序

    长按键C语言程序 zhchxgh | 2009-07-04 01:46:51    阅读:8246 发布文章 一共用了四个按钮. #define _KEYDOWN_TEST_TIME      (20 ...

  4. Algorithm:C++/python语言实现之求旋转数组最小值、求零子数组、求最长公共子序列和最长公共子串、求LCS与字符串编辑距离

    Algorithm:C++/python语言实现之求旋转数组最小值.求零子数组.求最长公共子序列和最长公共子串.求LCS与字符串编辑距离 目录 一.求旋转数组最小值 1.分析问题 2.解决思路 二.求 ...

  5. r语言平均值显著性检验_8小时整理!t检验原理!R语言实现!一文彻底搞定t检验(上)...

    本文中会加一些注解,是对于一些常用混淆概念得解释.主要内容包括t检验适用范围.实际案例以及R语言的实现. 因文章内容过长,所以分为上下两篇 t检验(t test)亦称 t检验,以t分布为基础,是定量资 ...

  6. 数据结构 | 实现串(定长顺序存储表示法)

    -------------------------------------------- 定长顺序存储表示法 -------------------------------------------- ...

  7. 线性表的顺序存储 c语言表达,线性表的基本操作顺序存储(C语言).doc

    线性表的基本操作顺序存储(C语言) #include#include#include#define LIST_INIT_SIZE/*线性表存储空间初始分配量*/#define LISTINCREMEN ...

  8. C语言 函数不定长参数 - C语言零基础入门教程

    目录 一.前言 二.函数不定长参数简介 1.va_start 2.va_arg 3.va_end 三.自定义不定长参数的函数 1.va_start/va_arg/va_end 案例一 2.va_sta ...

  9. java输入长宽高计算表面积_设计一个C语言程序计算长方体体积和表面积,长宽高通过键盘输入?????...

    展开全部 # include int main (void) { double l, w, h;//定义变量62616964757a686964616fe4b893e5b19e313333656463 ...

最新文章

  1. 基于matlab的对流层散射信道特性仿真,对流层散射信道建模和FPGA实现
  2. .bat文件(%~dp0)和call、echo批处理环境变量
  3. BUUCTF-Reverse:SimpleRev(算法分析题)
  4. Asp.net在IIS6.0权限设置的问题,大牛进
  5. java 继承作用_java三大特性之继承
  6. case class和trait
  7. (二)深入了解机器翻译
  8. 树莓派-解决apt-get upgrade速度慢的方法[更换阿里云源]
  9. PS(Photoshop)去水印的4个方法
  10. 电脑怎么分区硬盘分区方法
  11. 睡眠革命——摘抄总结大纲
  12. 工程经济作业1答案_国开电大工程经济与管理阶段作业1答案
  13. IDEA 中如何完成 Git 版本回退?
  14. python三行情书代码_“三行情书”——给你三行代码的爱恋~
  15. Uniapp 应用开机自启插件 Ba-Autoboot
  16. The 10 Best Ways to Get Banned From a Private Tracker
  17. PDF复制后乱码问题,怎么解决?
  18. Linux服务器取证研究,linux系统取证
  19. 用户注册邮箱通知和短信通知详解(php)
  20. 机器学习基础补习11---聚类

热门文章

  1. YOLObile:面向移动设备的「实时目标检测」算法
  2. CVPR2020 | PV-RCNN: 3D目标检测 Waymo挑战赛+KITTI榜 单模态第一算法
  3. apache 重定向tomcat端口_Tomcat
  4. Linux(64位)下OpenBabel 2.4.1、python2.7和Ipython实战(三)
  5. eclipse可以写前端吗_Python 竟然也可以写网页前端了!
  6. htop 和 bashtop 的一些不足
  7. MPB:微生物所王军组-​人类肠道病毒粒子富集及纳米孔测序
  8. ISME:二氧化碳和氮水平对植物根表菌群和功能的影响
  9. 单细胞转录组单飞第二期开课啦!!
  10. 哈佛牙学院博士后:教你口腔保健基本功之牙线篇