链串算法库构建

学习贺利坚老师链串算法库

数据结构之自建算法库——链串_串数据结构-CSDN博客

本人详细解析博客

串的链式存储及其基本操作实现_串链式存储的操作-CSDN博客

版本更新日志

V1.0 : 结合顺序串操作, 使用链串进行优化, 此次链串, 空间将不受限制, 只写了最基本的操作, 相当于 单链表的拓展实践, 本版本仍然存在的问题是, 可能没有对内存进行优化, 后续需要结合具体单片机编译器, 进行优化处理.

v2.0补丁: 在每个malloc后面,加入分配空间函数,防止分配失败,导致内存泄露

并且在合法性判断哪里, 加入释放函数. 

后续优化: 在时候函数库时, 数据结束后,记得释放 占用的空间.

函数库调用注意事项:

本文分成两个版本, V1.0是简洁版本, 可用于测试, 第二个优化了内存, 可能代码有点冗余 , 在开发中, 需要根据自己使用的编译器, 进行测试, 比如在c语言单片机中, 无法使用指针地址, 那就要换一种表达方式传参了.

V1.0

函数功能

//(1)将一个字符串数组赋值给链串
void Assignment_Chain_string(Chain_string *&New_String, char Assign_array[]);
//(2) 复制一个链串,到另一个链串
void Copy_Chain_String(Chain_string *&accept_string, Chain_string *copy_string);
//(3)判断两个串是否相等
bool Equal_Chain_String(Chain_string *judge_string1, Chain_string *judge_string2);
//(4)求链串串长
int Length_Chain_String(Chain_string *measure_string);
//(5)链串连接
Chain_string *Connect_Chain_String(Chain_string *link1, Chain_string *link2);
//(6)求链串的子串(从begin_loation开始的number个字符)
Chain_string *Get_Chain_Substring(Chain_string *Mother_string, int begin_loation, int number);
//(7)链串中插入串(从从begin_loation开始插入字符串,然后组合成新的串)
Chain_string *Insert_Chain_String(Chain_string *old_string, int begin_loation,Chain_string *insert_string);
//(8)删除链串(从begin 开始的number个字符)
Chain_string *Delete_Chain_String(Chain_string *old_string, int begin_loation,int number);
//(9)链串替换(从begin 开始的number个字符)
Chain_string *Replace_Chain_String(Chain_string *old_string, int begin_loation,int number,Chain_string *replace_string);
//(10)输出展示串
void Display_Chain_String(Chain_string *show_String);

链串头函数

Chain_string.h
#ifndef _CHAIN_STRING_H_INCLUDED
#define _CHAIN_STRING_H_INCLUDEDtypedef struct Chain_string
{char data;struct Chain_string *next;}Chain_string;//(1)将一个字符串数组赋值给链串
void Assignment_Chain_string(Chain_string *&New_String, char Assign_array[]);
//(2) 复制一个链串,到另一个链串
void Copy_Chain_String(Chain_string *&accept_string, Chain_string *copy_string);
//(3)判断两个串是否相等
bool Equal_Chain_String(Chain_string *judge_string1, Chain_string *judge_string2);
//(4)求链串串长
int Length_Chain_String(Chain_string *measure_string);
//(5)链串连接
Chain_string *Connect_Chain_String(Chain_string *link1, Chain_string *link2);
//(6)求链串的子串(从begin_loation开始的number个字符)
Chain_string *Get_Chain_Substring(Chain_string *Mother_string, int begin_loation, int number);
//(7)链串中插入串(从从begin_loation开始插入字符串,然后组合成新的串)
Chain_string *Insert_Chain_String(Chain_string *old_string, int begin_loation,Chain_string *insert_string);
//(8)删除链串(从begin 开始的number个字符)
Chain_string *Delete_Chain_String(Chain_string *old_string, int begin_loation,int number);
//(9)链串替换(从begin 开始的number个字符)
Chain_string *Replace_Chain_String(Chain_string *old_string, int begin_loation,int number,Chain_string *replace_string);
//(10)输出展示串
void Display_Chain_String(Chain_string *show_String);#endif

链串库函数

V1.0简洁版本

Chain_string.cpp
/*****************************************
功  能: 链串算法库
编程人: 无数碎片寻你
时  间: 2024.7.4
版  本: V1.0
******************************************/
#include <stdio.h>
#include <malloc.h>
#include "Chain_string.h"
/**************************************************
(1)函数名: Assignment_Chain_string
功  能: 将一个字符串数组赋值给链串,从而创建新串
参  数: (1)Chain_string *&New_String:要创建的新串(2)char Assign_array[]: 创建新串用到的数组数据
注  意:   创建新串传回是指针地址
返回值:  无
**************************************************/
void Assignment_Chain_string(Chain_string *&New_String, char Assign_array[])
{int counter;//尾结点,取出数组数据得到的新节点Chain_string *rear_Node,*new_Node;//为新链串分配空间New_String = (Chain_string *)malloc(sizeof(Chain_string));//初始化,尾指针指向头结点rear_Node = New_String;rear_Node->next = NULL;for(counter = 0; Assign_array[counter] != '\0'; counter++){new_Node = (Chain_string *)malloc(sizeof(Chain_string));new_Node->data = Assign_array[counter];new_Node->next = NULL;rear_Node->next = new_Node;rear_Node = new_Node;}rear_Node->next = NULL;
}/**************************************************
(2)函数名: Copy_Chain_String
功  能: 复制一个链串,到另一个链串
参  数: (1)Chain_string *&accept_string:接受复制的链串(2)Chain_string *copy_string: 被复制的链串
思  路:  逐个遍历,复制即可
返回值: 返回链串
**************************************************/
void Copy_Chain_String(Chain_string *&accept_string, Chain_string *copy_string)
{Chain_string *visit_Node = copy_string->next;   //遍历被复制节点Chain_string *copy_Node;    //每次复制的节点Chain_string *rear_Node;    //尾插法定义的尾结点//为接受复制链串分配空间accept_string = (Chain_string *)malloc(sizeof(Chain_string));//初始时,尾指针指向头结点rear_Node = accept_string;rear_Node->next = NULL;while(visit_Node != NULL){//为每次复制的节点,创建空间copy_Node = (Chain_string *)malloc(sizeof(Chain_string));copy_Node->data = visit_Node->data;copy_Node->next = NULL;//经典尾插rear_Node->next = copy_Node;rear_Node = copy_Node;//复制节点后移visit_Node = visit_Node->next;}rear_Node->next = NULL;
}/**************************************************
(3)函数名: Equal_Chain_String
功  能: 判断两个串是否相等
参  数: (1)Chain_string *judge_string1:要进行判断的串1(2)Chain_string *judge_string2:要进行判断的串2
返回值: bool 两个串是否相等?相等,true:不相等,false
**************************************************/
bool Equal_Chain_String(Chain_string *judge_string1, Chain_string *judge_string2)
{Chain_string *visit_Node1 = judge_string1->next;Chain_string *visit_Node2 = judge_string2->next;while(visit_Node1 != NULL && visit_Node2 != NULL && visit_Node1->data == visit_Node2->data){visit_Node1 = visit_Node1->next;visit_Node2 = visit_Node2->next;}if(visit_Node1 == NULL && visit_Node2 == NULL){return true;}else{return false;}}/**************************************************
(4)函数名:Length_Chain_String
功  能:求链串串长
参  数:Chain_string *measure_string:要进行测量串长的链串
返回值:int counter:返回链串长度
**************************************************/
int Length_Chain_String(Chain_string *measure_string)
{int counter = 0;Chain_string *measure_Node = measure_string;while(measure_Node->next != NULL){counter++;measure_Node = measure_Node->next;}return counter;
}
/**************************************************
(5)函数名:Connect_Chain_String
功  能:链串连接
参  数:(1)Chain_string *link1:要链接的第一个串(2)Chain_string *link2:要链接的第二个串
思 路: 定义两个变量,然后进行遍历两个串
返回值: Chain_string *New_String: 返回链接的串
**************************************************/
Chain_string *Connect_Chain_String(Chain_string *link1, Chain_string *link2)
{Chain_string *New_String;Chain_string *visit_Node;Chain_string *new_Node;Chain_string *rear_Node;//为组合串分配空间New_String = (Chain_string *)malloc(sizeof(Chain_string));//初始化时,尾指针指向串头rear_Node = New_String;rear_Node->next = NULL;//第一个串visit_Node = link1->next;while(visit_Node != NULL){//经典尾插法new_Node = (Chain_string *)malloc(sizeof(Chain_string));new_Node->data = visit_Node->data;rear_Node->next = new_Node;rear_Node = new_Node;visit_Node = visit_Node->next;}//第二个串visit_Node = link2->next;while(visit_Node != NULL){//经典尾插法new_Node = (Chain_string *)malloc(sizeof(Chain_string));new_Node->data = visit_Node->data;rear_Node->next = new_Node;rear_Node = new_Node;visit_Node = visit_Node->next;}rear_Node->next = NULL;return New_String;
}
/**************************************************
(6)函数名: Get_Chain_Substring
功  能: 求链串的子串(从begin_loation开始的number个字符)
参  数: (1)Chain_string *Mother_string:摘取子串的母串(2)int begin_loation:开始摘取的位置(3)int number:摘取子串的数量
返回值: Chain_string *new_Substring: 分隔得到的新子串
**************************************************/
Chain_string *Get_Chain_Substring(Chain_string *Mother_string, int begin_loation, int number)
{int counter;Chain_string *new_Substring;//新子串Chain_string *new_Node; //构建子串的节点Chain_string *visit_Node;   //访问旧串的节点Chain_string *rear_Node;    //新子串的尾指针new_Substring = (Chain_string *)malloc(sizeof(Chain_string));new_Substring->next = NULL;rear_Node = new_Substring;  //子串初始化if(begin_loation <= 0 || begin_loation >= Length_Chain_String(Mother_string)||number < 0 || begin_loation+number-1 > Length_Chain_String(Mother_string)  ){//错误:子串位置超标printf("\nError<6>: The substring position exceeds the standard.\n");return new_Substring;}//嗅探子串位置visit_Node = Mother_string->next;//从头结点后继开始,就是从1开始,同步推进for(counter = 1; counter <= begin_loation-1; counter++){visit_Node = visit_Node->next;}//开始复制子串for(counter = 0; counter < number; counter++){//经典尾插new_Node = (Chain_string *)malloc(sizeof(Chain_string));new_Node->data = visit_Node->data;new_Node->next = NULL;rear_Node->next = new_Node;rear_Node = new_Node;visit_Node = visit_Node->next;//是否超过,合法性判断}rear_Node->next = NULL;return new_Substring;
}
/**************************************************
(7)函数名: Insert_Chain_String
功  能: 链串中插入串(从从begin_loation开始插入字符串,然后组合成新的串)
参  数: (1)Chain_string *old_string:原始要进行插入操作的链串(2)int begin_loation:开始插入的位置(3)Chain_string *insert_string:  要插入的链串
注  意:  尾插法的应用
返回值: Chain_string *new_String;
**************************************************/
Chain_string *Insert_Chain_String(Chain_string *old_string, int begin_loation,Chain_string *insert_string)
{int counter;//形成的新串Chain_string *new_String;//建立新串,新节点与尾插法Chain_string *new_Node,*rear_Node;//访问两个串的指针Chain_string *visit_Node1,*visit_Node2;//新串初始化new_String = (Chain_string *)malloc(sizeof(Chain_string));new_String->next = NULL;rear_Node = new_String;//插入位置合法性检测if(begin_loation <= 0 || (begin_loation>Length_Chain_String(old_string)+1)){//错误:链串插入位置错误printf("\nError<7>: wrong insertion position of chain string.\n");}//旧串1插入位置前的串(i-1个元素)visit_Node1 = old_string->next;for(counter = 0; counter < begin_loation-1; counter++){new_Node = (Chain_string *)malloc(sizeof(Chain_string));new_Node->data = visit_Node1->data;rear_Node->next = new_Node;rear_Node = new_Node;visit_Node1 = visit_Node1->next;     //最后出来是指向第i个元素}//加入串2visit_Node2 = insert_string->next;while(visit_Node2 != NULL){new_Node = (Chain_string *)malloc(sizeof(Chain_string));new_Node->data = visit_Node2->data;rear_Node->next = new_Node;rear_Node = new_Node;visit_Node2 = visit_Node2->next;}//加入串1插入位置的后续串(第begin_loation个元素到最后)while(visit_Node1 != NULL){new_Node = (Chain_string *)malloc(sizeof(Chain_string));new_Node->data = visit_Node1->data;rear_Node->next = new_Node;rear_Node = new_Node;visit_Node1 = visit_Node1->next;}rear_Node->next = NULL;return new_String;
}
/**************************************************
(8)函数名: Delete_Chain_String
功  能: 删除链串(从begin 开始的number个字符)
参  数: (1)Chain_string *old_string:在本串基础上截取(2)int begin_loation:开始删除的位置(3)int number:删除的数量
思  路:  有选择的复制剪切
返回值: Chain_string *new_String:处理完的新串,返回
**************************************************/
Chain_string *Delete_Chain_String(Chain_string *old_string, int begin_loation,int number)
{int counter;Chain_string *new_String;Chain_string *new_Node;Chain_string *visit_Node;Chain_string *rear_Node;new_String = (Chain_string *)malloc(sizeof(Chain_string));new_String->next = NULL;rear_Node = new_String;if( begin_loation <= 0 ||begin_loation > Length_Chain_String(old_string) ||number < 0 ||(begin_loation+number-1 > Length_Chain_String(old_string))){//错误: 删除位置错误printf("\nError<8>: Error in deleting location.\n");}//把删除位置之前的节点复制visit_Node = old_string->next;for(counter = 0; counter < begin_loation-1; counter++){new_Node = (Chain_string *)malloc(sizeof(Chain_string));new_Node->data = visit_Node->data;rear_Node->next = new_Node;rear_Node = new_Node;visit_Node = visit_Node->next;}//跳过要删除的节点for(counter = 0; counter<number; counter++){visit_Node = visit_Node->next;}//把后继节点复制加入new_Stringwhile(visit_Node != NULL){new_Node = (Chain_string *)malloc(sizeof(Chain_string));new_Node->data = visit_Node->data;rear_Node->next = new_Node;rear_Node = new_Node;visit_Node = visit_Node->next;}rear_Node->next = NULL;return new_String;
}/**************************************************
(9)函数名: Replace_Chain_String
功  能: 链串替换(从begin 开始的number个字符)
参  数: (1)Chain_string *old_string:在原始串上进行操作(2)int begin_loation:开始替换的位置(头结点不算,头结点之后算第一个节点)(3)int number:替换的数量(4)Chain_string *replace_string:;要替换成的链串
返回值:  Chain_string *new_String:替换完,形成的链串
**************************************************/
Chain_string *Replace_Chain_String(Chain_string *old_string, int begin_loation,int number,Chain_string *replace_string)
{int counter;//形成的新串Chain_string *new_String;//建立新串,新节点与尾插法Chain_string *new_Node,*rear_Node;//访问两个串的指针Chain_string *visit_Node1,*visit_Node2;//新串初始化new_String = (Chain_string *)malloc(sizeof(Chain_string));new_String->next = NULL;rear_Node = new_String;//替换位置合法性检测if(begin_loation <= 0 || begin_loation>Length_Chain_String(old_string)){//错误:链串替换位置错误printf("\nError<9>: the chain string replacement position is wrong.\n");}//旧串替换位置前的串visit_Node1 = old_string->next;for(counter = 0; counter < begin_loation-1; counter++){new_Node = (Chain_string *)malloc(sizeof(Chain_string));new_Node->data = visit_Node1->data;new_Node->next = NULL;rear_Node->next = new_Node;rear_Node = new_Node;visit_Node1 = visit_Node1->next;     //最后出来是指向第i个元素}//visit_Node1跳过number个节点for(counter = 0; counter < number; counter++){visit_Node1 = visit_Node1->next;}//把替换的串,加入visit_Node2 = replace_string->next;while(visit_Node2 != NULL){new_Node = (Chain_string *)malloc(sizeof(Chain_string));new_Node->data = visit_Node2->data;new_Node->next = NULL;rear_Node->next = new_Node;rear_Node = new_Node;visit_Node2 = visit_Node2->next;}//旧串第二段while(visit_Node1 != NULL){new_Node = (Chain_string *)malloc(sizeof(Chain_string));new_Node->data = visit_Node1->data;new_Node->next = NULL;rear_Node->next = new_Node;rear_Node = new_Node;visit_Node1 = visit_Node1->next;}rear_Node->next = NULL;return new_String;
}/**************************************************
(10)函数名: Display_Chain_String
功  能: 输出展示串
参  数: Chain_string *show_String:要进行展示的串
返回值: 无
**************************************************/
void Display_Chain_String(Chain_string *show_String)
{Chain_string *show_Node;show_Node = show_String->next;while(show_Node != NULL){printf("%c",show_Node->data);show_Node = show_Node->next;}printf("\n");}

V2.0补丁版本

main.cpp
/*****************************************
功  能: 链串算法库
编程人: 无数碎片寻你
时  间: 2024.7.4
版  本: V1.0
******************************************/
#include <stdio.h>
#include <malloc.h>
#include "Chain_string.h"
/**************************************************
(1)函数名: Assignment_Chain_string
功  能: 将一个字符串数组赋值给链串,从而创建新串
参  数: (1)Chain_string *&New_String:要创建的新串(2)char Assign_array[]: 创建新串用到的数组数据
注  意:   创建新串传回是指针地址
返回值:  无
**************************************************/
void Assignment_Chain_string(Chain_string *&New_String, char Assign_array[])
{int counter;//尾结点,取出数组数据得到的新节点Chain_string *rear_Node,*new_Node;//为新链串分配空间New_String = (Chain_string *)malloc(sizeof(Chain_string));//初始化,尾指针指向头结点rear_Node = New_String;rear_Node->next = NULL;for(counter = 0; Assign_array[counter] != '\0'; counter++){new_Node = (Chain_string *)malloc(sizeof(Chain_string));if(!new_Node)   //检查内存分配是否成功{while(New_String->next)//释放已经分配的节点{Chain_string *temp = New_String->next;New_String->next = temp->next;free(temp);}free(New_String);//释放头结点return;}new_Node->data = Assign_array[counter];new_Node->next = NULL;rear_Node->next = new_Node;rear_Node = new_Node;}rear_Node->next = NULL;
}/**************************************************
(2)函数名: Copy_Chain_String
功  能: 复制一个链串,到另一个链串
参  数: (1)Chain_string *&accept_string:接受复制的链串(2)Chain_string *copy_string: 被复制的链串
思  路:  逐个遍历,复制即可
返回值: 返回链串
**************************************************/
void Copy_Chain_String(Chain_string *&accept_string, Chain_string *copy_string)
{Chain_string *visit_Node = copy_string->next;   //遍历被复制节点Chain_string *copy_Node;    //每次复制的节点Chain_string *rear_Node;    //尾插法定义的尾结点//为接受复制链串分配空间accept_string = (Chain_string *)malloc(sizeof(Chain_string));//初始时,尾指针指向头结点rear_Node = accept_string;rear_Node->next = NULL;while(visit_Node != NULL){//为每次复制的节点,创建空间copy_Node = (Chain_string *)malloc(sizeof(Chain_string));if(!copy_Node)   //检查内存分配是否成功{while(accept_string->next)//释放已经分配的节点{Chain_string *temp = accept_string->next;accept_string->next = temp->next;free(temp);}free(accept_string);//释放头结点return;}copy_Node->data = visit_Node->data;copy_Node->next = NULL;//经典尾插rear_Node->next = copy_Node;rear_Node = copy_Node;//复制节点后移visit_Node = visit_Node->next;}rear_Node->next = NULL;
}/**************************************************
(3)函数名: Equal_Chain_String
功  能: 判断两个串是否相等
参  数: (1)Chain_string *judge_string1:要进行判断的串1(2)Chain_string *judge_string2:要进行判断的串2
返回值: bool 两个串是否相等?相等,true:不相等,false
**************************************************/
bool Equal_Chain_String(Chain_string *judge_string1, Chain_string *judge_string2)
{Chain_string *visit_Node1 = judge_string1->next;Chain_string *visit_Node2 = judge_string2->next;while(visit_Node1 != NULL && visit_Node2 != NULL && visit_Node1->data == visit_Node2->data){visit_Node1 = visit_Node1->next;visit_Node2 = visit_Node2->next;}if(visit_Node1 == NULL && visit_Node2 == NULL){return true;}else{return false;}}/**************************************************
(4)函数名:Length_Chain_String
功  能:求链串串长
参  数:Chain_string *measure_string:要进行测量串长的链串
返回值:int counter:返回链串长度
**************************************************/
int Length_Chain_String(Chain_string *measure_string)
{int counter = 0;Chain_string *measure_Node = measure_string;while(measure_Node->next != NULL){counter++;measure_Node = measure_Node->next;}return counter;
}
/**************************************************
(5)函数名:Connect_Chain_String
功  能:链串连接
参  数:(1)Chain_string *link1:要链接的第一个串(2)Chain_string *link2:要链接的第二个串
思 路: 定义两个变量,然后进行遍历两个串
返回值: Chain_string *New_String: 返回链接的串
**************************************************/
Chain_string *Connect_Chain_String(Chain_string *link1, Chain_string *link2)
{Chain_string *New_String;Chain_string *visit_Node;Chain_string *new_Node;Chain_string *rear_Node;//为组合串分配空间New_String = (Chain_string *)malloc(sizeof(Chain_string));//初始化时,尾指针指向串头rear_Node = New_String;rear_Node->next = NULL;//第一个串visit_Node = link1->next;while(visit_Node != NULL){//经典尾插法new_Node = (Chain_string *)malloc(sizeof(Chain_string));if(!new_Node)   //检查内存分配是否成功{while(New_String->next)//释放已经分配的节点{Chain_string *temp = New_String->next;New_String->next = temp->next;free(temp);}free(New_String);//释放头结点return New_String;}new_Node->data = visit_Node->data;rear_Node->next = new_Node;rear_Node = new_Node;visit_Node = visit_Node->next;}//第二个串visit_Node = link2->next;while(visit_Node != NULL){//经典尾插法new_Node = (Chain_string *)malloc(sizeof(Chain_string));if(!new_Node)   //检查内存分配是否成功{while(New_String->next)//释放已经分配的节点{Chain_string *temp = New_String->next;New_String->next = temp->next;free(temp);}free(New_String);//释放头结点return New_String;}new_Node->data = visit_Node->data;rear_Node->next = new_Node;rear_Node = new_Node;visit_Node = visit_Node->next;}rear_Node->next = NULL;return New_String;
}
/**************************************************
(6)函数名: Get_Chain_Substring
功  能: 求链串的子串(从begin_loation开始的number个字符)
参  数: (1)Chain_string *Mother_string:摘取子串的母串(2)int begin_loation:开始摘取的位置(3)int number:摘取子串的数量
返回值: Chain_string *new_Substring: 分隔得到的新子串
**************************************************/
Chain_string *Get_Chain_Substring(Chain_string *Mother_string, int begin_loation, int number)
{int counter;Chain_string *new_Substring;//新子串Chain_string *new_Node; //构建子串的节点Chain_string *visit_Node;   //访问旧串的节点Chain_string *rear_Node;    //新子串的尾指针new_Substring = (Chain_string *)malloc(sizeof(Chain_string));new_Substring->next = NULL;rear_Node = new_Substring;  //子串初始化if(begin_loation <= 0 || begin_loation >= Length_Chain_String(Mother_string)||number < 0 || begin_loation+number-1 > Length_Chain_String(Mother_string)  ){//错误:子串位置超标printf("\nError<6>: The substring position exceeds the standard.\n");free(new_Substring); // 释放头节点内存return new_Substring;}//嗅探子串位置visit_Node = Mother_string->next;//从头结点后继开始,就是从1开始,同步推进for(counter = 1; counter <= begin_loation-1; counter++){visit_Node = visit_Node->next;}//开始复制子串for(counter = 0; counter < number; counter++){//经典尾插new_Node = (Chain_string *)malloc(sizeof(Chain_string));if(!new_Node)   //检查内存分配是否成功{while(new_Substring->next)//释放已经分配的节点{Chain_string *temp = new_Substring->next;new_Substring->next = temp->next;free(temp);}free(new_Substring);//释放头结点return new_Substring;}new_Node->data = visit_Node->data;new_Node->next = NULL;rear_Node->next = new_Node;rear_Node = new_Node;visit_Node = visit_Node->next;//是否超过,合法性判断}rear_Node->next = NULL;return new_Substring;
}
/**************************************************
(7)函数名: Insert_Chain_String
功  能: 链串中插入串(从从begin_loation开始插入字符串,然后组合成新的串)
参  数: (1)Chain_string *old_string:原始要进行插入操作的链串(2)int begin_loation:开始插入的位置(3)Chain_string *insert_string:  要插入的链串
注  意:  尾插法的应用
返回值: Chain_string *new_String;
**************************************************/
Chain_string *Insert_Chain_String(Chain_string *old_string, int begin_loation,Chain_string *insert_string)
{int counter;//形成的新串Chain_string *new_String;//建立新串,新节点与尾插法Chain_string *new_Node,*rear_Node;//访问两个串的指针Chain_string *visit_Node1,*visit_Node2;//新串初始化new_String = (Chain_string *)malloc(sizeof(Chain_string));new_String->next = NULL;rear_Node = new_String;//插入位置合法性检测if(begin_loation <= 0 || (begin_loation>Length_Chain_String(old_string)+1)){//错误:链串插入位置错误printf("\nError<7>: wrong insertion position of chain string.\n");free(new_String); // 释放头节点内存return new_String;}//旧串1插入位置前的串(i-1个元素)visit_Node1 = old_string->next;for(counter = 0; counter < begin_loation-1; counter++){new_Node = (Chain_string *)malloc(sizeof(Chain_string));\if(!new_Node)   //检查内存分配是否成功{while(new_String->next)//释放已经分配的节点{Chain_string *temp = new_String->next;new_String->next = temp->next;free(temp);}free(new_String);//释放头结点return new_String;}new_Node->data = visit_Node1->data;rear_Node->next = new_Node;rear_Node = new_Node;visit_Node1 = visit_Node1->next;     //最后出来是指向第i个元素}//加入串2visit_Node2 = insert_string->next;while(visit_Node2 != NULL){new_Node = (Chain_string *)malloc(sizeof(Chain_string));if(!new_Node)   //检查内存分配是否成功{while(new_String->next)//释放已经分配的节点{Chain_string *temp = new_String->next;new_String->next = temp->next;free(temp);}free(new_String);//释放头结点return new_String;}new_Node->data = visit_Node2->data;rear_Node->next = new_Node;rear_Node = new_Node;visit_Node2 = visit_Node2->next;}//加入串1插入位置的后续串(第begin_loation个元素到最后)while(visit_Node1 != NULL){new_Node = (Chain_string *)malloc(sizeof(Chain_string));if(!new_Node)   //检查内存分配是否成功{while(new_String->next)//释放已经分配的节点{Chain_string *temp = new_String->next;new_String->next = temp->next;free(temp);}free(new_String);//释放头结点return new_String;}new_Node->data = visit_Node1->data;rear_Node->next = new_Node;rear_Node = new_Node;visit_Node1 = visit_Node1->next;}rear_Node->next = NULL;return new_String;
}
/**************************************************
(8)函数名: Delete_Chain_String
功  能: 删除链串(从begin 开始的number个字符)
参  数: (1)Chain_string *old_string:在本串基础上截取(2)int begin_loation:开始删除的位置(3)int number:删除的数量
思  路:  有选择的复制剪切
返回值: Chain_string *new_String:处理完的新串,返回
**************************************************/
Chain_string *Delete_Chain_String(Chain_string *old_string, int begin_loation,int number)
{int counter;Chain_string *new_String;Chain_string *new_Node;Chain_string *visit_Node;Chain_string *rear_Node;new_String = (Chain_string *)malloc(sizeof(Chain_string));new_String->next = NULL;rear_Node = new_String;if( begin_loation <= 0 ||begin_loation > Length_Chain_String(old_string) ||number < 0 ||(begin_loation+number-1 > Length_Chain_String(old_string))){//错误: 删除位置错误printf("\nError<8>: Error in deleting location.\n");free(new_String); // 释放头节点内存return new_String;}//把删除位置之前的节点复制visit_Node = old_string->next;for(counter = 0; counter < begin_loation-1; counter++){new_Node = (Chain_string *)malloc(sizeof(Chain_string));if(!new_Node)   //检查内存分配是否成功{while(new_String->next)//释放已经分配的节点{Chain_string *temp = new_String->next;new_String->next = temp->next;free(temp);}free(new_String);//释放头结点return new_String;}new_Node->data = visit_Node->data;rear_Node->next = new_Node;rear_Node = new_Node;visit_Node = visit_Node->next;}//跳过要删除的节点for(counter = 0; counter<number; counter++){visit_Node = visit_Node->next;}//把后继节点复制加入new_Stringwhile(visit_Node != NULL){new_Node = (Chain_string *)malloc(sizeof(Chain_string));if(!new_Node)   //检查内存分配是否成功{while(new_String->next)//释放已经分配的节点{Chain_string *temp = new_String->next;new_String->next = temp->next;free(temp);}free(new_String);//释放头结点return new_String;}new_Node->data = visit_Node->data;rear_Node->next = new_Node;rear_Node = new_Node;visit_Node = visit_Node->next;}rear_Node->next = NULL;return new_String;
}/**************************************************
(9)函数名: Replace_Chain_String
功  能: 链串替换(从begin 开始的number个字符)
参  数: (1)Chain_string *old_string:在原始串上进行操作(2)int begin_loation:开始替换的位置(头结点不算,头结点之后算第一个节点)(3)int number:替换的数量(4)Chain_string *replace_string:;要替换成的链串
返回值:  Chain_string *new_String:替换完,形成的链串
**************************************************/
Chain_string *Replace_Chain_String(Chain_string *old_string, int begin_loation,int number,Chain_string *replace_string)
{int counter;//形成的新串Chain_string *new_String;//建立新串,新节点与尾插法Chain_string *new_Node,*rear_Node;//访问两个串的指针Chain_string *visit_Node1,*visit_Node2;//新串初始化new_String = (Chain_string *)malloc(sizeof(Chain_string));new_String->next = NULL;rear_Node = new_String;//替换位置合法性检测if(begin_loation <= 0 || begin_loation>Length_Chain_String(old_string)||number < 0 || (begin_loation+number-1 > Length_Chain_String(old_string))){//错误:链串替换位置错误printf("\nError<9>: the chain string replacement position is wrong.\n");free(new_String); // 释放头节点内存return new_String;}//旧串替换位置前的串visit_Node1 = old_string->next;for(counter = 0; counter < begin_loation-1; counter++){new_Node = (Chain_string *)malloc(sizeof(Chain_string));if(!new_Node)   //检查内存分配是否成功{while(new_String->next)//释放已经分配的节点{Chain_string *temp = new_String->next;new_String->next = temp->next;free(temp);}free(new_String);//释放头结点return new_String;}new_Node->data = visit_Node1->data;new_Node->next = NULL;rear_Node->next = new_Node;rear_Node = new_Node;visit_Node1 = visit_Node1->next;     //最后出来是指向第i个元素}//visit_Node1跳过number个节点for(counter = 0; counter < number; counter++){visit_Node1 = visit_Node1->next;}//把替换的串,加入visit_Node2 = replace_string->next;while(visit_Node2 != NULL){new_Node = (Chain_string *)malloc(sizeof(Chain_string));if(!new_Node)   //检查内存分配是否成功{while(new_String->next)//释放已经分配的节点{Chain_string *temp = new_String->next;new_String->next = temp->next;free(temp);}free(new_String);//释放头结点return new_String;}new_Node->data = visit_Node2->data;new_Node->next = NULL;rear_Node->next = new_Node;rear_Node = new_Node;visit_Node2 = visit_Node2->next;}//旧串第二段while(visit_Node1 != NULL){new_Node = (Chain_string *)malloc(sizeof(Chain_string));if(!new_Node)   //检查内存分配是否成功{while(new_String->next)//释放已经分配的节点{Chain_string *temp = new_String->next;new_String->next = temp->next;free(temp);}free(new_String);//释放头结点return new_String;}new_Node->data = visit_Node1->data;new_Node->next = NULL;rear_Node->next = new_Node;rear_Node = new_Node;visit_Node1 = visit_Node1->next;}rear_Node->next = NULL;return new_String;
}/**************************************************
(10)函数名: Display_Chain_String
功  能: 输出展示串
参  数: Chain_string *show_String:要进行展示的串
返回值: 无
**************************************************/
void Display_Chain_String(Chain_string *show_String)
{Chain_string *show_Node;show_Node = show_String->next;if(show_Node == NULL){//警告:什么都没有,无法输出字符串printf("\nWarning<10>: Nothing, unable to output string.\n");}else{while(show_Node != NULL){printf("%c",show_Node->data);show_Node = show_Node->next;}printf("\n");}}

main函数测试1:

范围正常情况下测试:

main.cpp
#include <stdio.h>
#include "Chain_string.h"int main()
{Chain_string *test_String,*test_String1,*test_String2,*test_String3,*test_String4;char test_char1[ ] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','\0'};char test_char2[] = {'1','2','3','\0'};printf("\n链串的基本运算如下:\n");printf("\n(1)建立串test_String和test_String1\n");Assignment_Chain_string(test_String, test_char1);printf("\n(2)输出串test_String:\n");Display_Chain_String(test_String);Assignment_Chain_string(test_String1, test_char2);printf("\n(2)输出串test_String1:\n");Display_Chain_String(test_String1);printf("\n(3)串test_String的长度:%d\n",Length_Chain_String(test_String));printf("\n(4)在串test_String的第9个字符位置插入串test_String1而产生test_String2\n");test_String2 = Insert_Chain_String(test_String,9,test_String1);printf("\n(5)输出串test_String2:\n");Display_Chain_String(test_String2);printf("\n(6)删除串test_String第二个字符开始的5个字符而产生串2\n");test_String2 = Delete_Chain_String(test_String,2,5);printf("\n(7)输出串test_String2:\n");Display_Chain_String(test_String2);printf("\n(8)将串2第2个字符开始的5个字符替换成串1而产生串2\n");test_String2 = Replace_Chain_String(test_String2,2,5,test_String1);printf("\n(9)输出串2\n");Display_Chain_String(test_String2);printf("\n(10)提取串s的第2个字符开始的10个字符而产生串3\n");test_String3 = Get_Chain_Substring(test_String,2,10);printf("\n(11)输出串3\n");Display_Chain_String(test_String3);printf("\n(12)将串1和串2链接起来而成产生串4\n");test_String4 = Connect_Chain_String(test_String1,test_String2);printf("\n(13)输出串4\n");Display_Chain_String(test_String4);return 0;}

运行结果展示:

main函数测试2:

范围超出情况下测试:

主函数文件名字

main.cpp
#include <stdio.h>
#include "Chain_string.h"int main()
{Chain_string *test_String,*test_String1,*test_String2,*test_String3,*test_String4;char test_char1[ ] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','\0'};char test_char2[] = {'1','2','3','\0'};printf("\n链串的基本运算如下:\n");printf("\n(1)建立串test_String和test_String1\n");Assignment_Chain_string(test_String, test_char1);printf("\n(2)输出串test_String:\n");Display_Chain_String(test_String);Assignment_Chain_string(test_String1, test_char2);printf("\n(2)输出串test_String1:\n");Display_Chain_String(test_String1);printf("\n(3)串test_String的长度:%d\n",Length_Chain_String(test_String));printf("\n(4)在串test_String的第100个字符位置插入串test_String1而产生test_String2\n");test_String2 = Insert_Chain_String(test_String,100,test_String1);printf("\n(5)输出串test_String2:\n");Display_Chain_String(test_String2);printf("\n(6)删除串test_String第20个字符开始的10个字符而产生串3\n");test_String3 = Delete_Chain_String(test_String,20,10);printf("\n(7)输出串test_String3:\n");Display_Chain_String(test_String3);printf("\n(8)将串第2个字符开始的99个字符替换成串1而产生串4\n");test_String4 = Replace_Chain_String(test_String,2,99,test_String1);printf("\n(9)输出串4\n");Display_Chain_String(test_String4);printf("\n(10)提取串s的第2个字符开始的88个字符而产生串3\n");test_String3 = Get_Chain_Substring(test_String,2,88);printf("\n(11)输出串3\n");Display_Chain_String(test_String3);printf("\n(12)将串和串1链接起来而成产生串4\n");test_String4 = Connect_Chain_String(test_String,test_String1);printf("\n(13)输出串4\n");Display_Chain_String(test_String4);return 0;}

运行结果展示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/40907.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

地级市空气质量指数AQI、环境污染PM2.5、SO2

2015-2021年地级市月度空气质量数据&#xff08;AQI、SO2、NO2、PM2.5、PM10、O3、CO&#xff09; 目录 探究环境污染对经济增长的影响 一、引言 二、数据来源与描述性统计 三、实证模型 &#xff08;一&#xff09;模型设定 &#xff08;二&#xff09;变量说明 四、程…

经典递归分析

在前面一篇中, 已经看过许多直观的递归的例子, 在这篇里, 将分析两个经典的递归问题, 阶乘与菲波那契数列数列, 在此过程中, 还将对比递归与循环(迭代)间的异同, 探讨递归与内存中的栈的关系, 以及递归的效率等问题. 如无特别说明, 示例使用的是 Java, IDE 则为 Eclipse. 阶乘(…

介绍一些好玩且实用的开源的AI工具

介绍一些好玩且实用的开源的AI工具 随着人工智能技术的迅猛发展&#xff0c;开源社区涌现出了许多关于AI的项目&#xff0c;这些项目不仅展示了技术的创新力&#xff0c;也为开发者提供了丰富的工具和资源。本文将介绍几个既有趣又实用的开源人工智能工具&#xff0c;它们不仅…

【电路笔记】-B类放大器

B类放大器 文章目录 B类放大器1、概述2、B类放大器介绍3、推挽式配置4、限制交叉失真5、B类放大器效率6、总结1、概述 我们在之前的文章中已经知道,A 类放大器的特点是导通角为 360,理论最大效率为 50%。 在本文中,我们将详细介绍另一类放大器,称为B类放大器,它是为解决A…

GD32单片机使用TIMER进行外部计数

网上关于使用GD32单片机的ETI引脚作为计数器输入引脚的资料少之又少&#xff0c;此文希望有需要的朋友避免弯路。 我们把ETI引脚作为方波输入引脚&#xff0c;其中ETR输入引脚为PA0。通过查资料得知&#xff1a; 因此将先将引脚进行映射&#xff0c;代码如下&#xff1a; voi…

Linux_进程池

目录 1、进程池基本逻辑 2、实现进程池框架 3、文件描述符的继承 4、分配任务给进程池 5、让进程池执行任务 6、回收子进程 7、进程池总结 结语 前言&#xff1a; 在Linux下&#xff0c;进程池表示把多个子进程用数据结构的方式进行统一管理&#xff0c;在任何时候…

18. JAVA 多线程锁介绍

1. 前言 本节内容主要是对 Java 多线程锁进行介绍&#xff0c;是对锁的一个全方位的概述&#xff0c;为我们对后续深入学习不同的锁的使用方法奠定一个良好的基础。本节内容的知识点如下&#xff1a; 乐观锁与悲观锁的概念&#xff0c;以及两种锁之间的区别&#xff0c;这是并…

【unity实战】使用unity的新输入系统InputSystem+有限状态机设计一个玩家状态机控制——实现玩家的待机 移动 闪避 连击 受击 死亡状态切换

最终效果 文章目录 最终效果前言人物素材新输入系统InputSystem的配置动画配置代码文件路径状态机脚本创建玩家不同的状态脚本玩家控制源码完结 前言 前面我们已经写过了使用有限状态机制作一个敌人AI&#xff1a;【unity实战】在Unity中使用有限状态机制作一个敌人AI 那么玩…

【苍穹外卖】Day1遇到的问题

1、lombok版本不兼容问题 java: java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor (in unnamed module 0x3278991b) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) because module jdk.comp…

Java项目:基于SSM框架实现的毕业论文管理系统【ssm+B/S架构+源码+数据库+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的毕业论文管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能…

javaScript(九) 数组

] console.log(af.pop()) console.log(af) 第一个输出&#xff1a;{id:2,name:“枷”,score:“98”} 第二个输出&#xff1a;[ {id:1,name:“My”,score:“90”}, {id:3,name:“123”,score:“80”} ] Array.prototype.shift() 删除数组中的第一个元素&#xff0c;该方法…

一个项目学习Vue3---Vue计算属性

观察下面一段代码&#xff0c;学习Vue计算属性 <template><div><span>用户大于10岁的数量&#xff1a;{{ userVue.filter(user>user.age>10).length}}</span><span>用户大于10岁的数量2&#xff1a;{{ userAgeltTen}}</span><sp…

基于轨迹信息的图像近距离可行驶区域方案验证

一 图像可行驶区域方案 1.1 标定场景 1.2 标定步骤 设计一定间距标定场&#xff0c;在标定场固定位置设置摄像头标定标识点。主车开到标定场固定位置录制主车在该位置各个摄像头数据&#xff0c;通过摄像头捕获图像获取图像上关键点坐标pts-2d基于标定场设计&#xff0c;计算…

vue实现左右拖动分屏

效果图如下&#xff1a; 封装组件 <template><div ref"container" class"container"><div class"left-content" :style"leftStyle">/**定义左侧插槽**/<slot name"left"></slot></div>…

Springboot+Vue3开发学习笔记《2》

SpringbootVue3开发学习笔记《2》 博主正在学习SpringbootVue3开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。 总共涉及两部分&#xff0c;第一部分为基础部分学习&#xff0c;第二部分为实战部分。 一、学习路径 1.1 基础部分 配置文件整合MyBatisBea…

QQ聊天记录删除了怎么恢复?这4个方法让你秒找回!

在现代社会&#xff0c;QQ已经成为我们日常交流和工作中不可或缺的沟通工具。然而&#xff0c;有时我们可能会不小心删除了重要的聊天记录&#xff0c;这会带来诸多不便甚至困扰。那么&#xff0c;当你发现自己误删了数据&#xff0c;qq聊天记录删除了怎么恢复呢&#xff1f;有…

2024-07-04 base SAS programming学习笔记8(HTML)

当使用ODS来进行结果或数据集输出的时候&#xff0c;可以同时设置多个ODS 命令&#xff0c;同时输出到多个不同的文件。使用_ALL_ 表示关闭所有的ODS输出窗口&#xff0c;比如&#xff1a; ods html file(body)"html-file-pathname"; ods html file"pdf-file-pa…

中国东方资产管理25届秋招北森测评笔试如何高分通过?真题考点分析看完这篇就够了

一、东方资管校招测评题型分析 中国东方资产管理股份有限公司&#xff08;中国东方资管&#xff09;的校园招聘测评题型主要包括以下几个部分&#xff1a; 1. **计分题&#xff0c;行测知识**&#xff1a;这部分题量大约在56-57题左右&#xff0c;分为不同的模块进行计时测试。…

Spzhi知识付费社区主题免费下载

主题介绍 用typecho打造一款知识付费社区主题&#xff0c;带会员功能&#xff0c;为内容创业者提供知识变现一站式解决方案&#xff0c;让用户沉淀到自己的平台&#xff0c;形成自己的私域流量池&#xff0c;打造流量闭环&#xff0c;零门槛搭建你的移动网络课堂 主题功能 支…