#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct {//定义能储存100个字符串的顺序表
char a[100];
int len;
}seqString;
seqString * initString(seqString* s){//串初始化
s=(seqString*)malloc(sizeof(seqString));
s->len=0;
return s;
}
void craeteStr(seqString* s){//输入字符串
int i;
char str[100];
printf("请输入字符串:\n");
gets(str);
for(i = 0;str[i] != '\0'; i++){
s->a[i] = str[i];
s->len++;//修改表长
}
}
void printStr(seqString* s){//输出字符串
int i;
for(i = 0;i < s->len; i++)//依次输出字符串的各字符
printf("%c",s->a[i]);
printf("\n");
}
void delStr(seqString *s,int i,int n){//删除s从下标i开始的长度为n的子串,并返回删除后的字符串
int j;
if(i<0||i>=s->len){//当输入的下标i位置非法时;
printf("\n 位置非法!"); return;
}
if(i+n>s->len-1){//当删除的元素超过了表长,
s->len=i;//直接修改表长,返回
return;
}
//执行至此处代表表长大于要删除的元素数量
for(j=i;j+n<s->len;j++){//将i+n后面的元素前移
s->a[j]=s->a[j+n];
}
s->len=s->len-n;//修改表长
}
void insertStr(seqString *s1,int i,seqString *s2){//在s1的下标i处插入s2
int j,k;
k=s2->len;
for(j=s1->len-1;j>=i;j--){
s1->a[j+k]=s1->a[j];//从最后一个元素开始往后移;
}
for(j=0;j<k;j++){//将s2插入s1;
s1->a[i+j]=s2->a[j];
}
s1->len=s1->len+k;//修改s1的表长
}
void replaceStr12(seqString *s1,int i,int n,seqString *s2){//用s2代替子串s1[i......n]
int j,k;
int x;//s1的n后面的元素需要移动的位数;
x=s2->len-(n-i+1);
if(x==0){//插入元素的个数等于子串元素个数
for(j=i,k=0;k<s2->len;j++,k++){
s1->a[j]=s2->a[k];
}
}
if(x>0){//插入的元素多于子串个数
for(j=s1->len-1;j>n;j--){
s1->a[j+x]=s1->a[j];//从最后一个元素开始后移
}
for(j=i,k=0;k<s2->len;j++,k++){
s1->a[j]=s2->a[k];//将s2插入
}
s1->len=s1->len+x;//修改表长
}
else if(x<0){//插入的元素少于子串个数
for(j=n+1;j<s1->len;j++){
s1->a[j+x]=s1->a[j];//从第n+1个元素开始前移
}
for(j=i,k=0;k<s2->len;j++,k++){
s1->a[j]=s2->a[k];//将s2插入
}
s1->len=s1->len+x;//修改表长
}
}
void replaceStr(seqString *s1,int i,int n,seqString *s2){//用s2代替子串s1[i]下标i开始共n个元素;
int j,k;
int x;//s1的n后面的元素需要移动的位数;
x=s2->len-n;
if(x==0){//插入元素的个数等于子串元素个数
for(j=i,k=0;k<s2->len;j++,k++){
s1->a[j]=s2->a[k];
}
}
if(x>0){//插入的元素多于子串个数
for(j=s1->len-1;j>n;j--){
s1->a[j+x]=s1->a[j];//从最后一个元素开始后移
}
for(j=i,k=0;k<s2->len;j++,k++){
s1->a[j]=s2->a[k];//将s2插入
}
s1->len=s1->len+x;//修改表长
}
else if(x<0){//插入的元素少于子串个数
for(j=n+1;j<s1->len;j++){
s1->a[j+x]=s1->a[j];//从第n+1个元素开始前移
}
for(j=i,k=0;k<s2->len;j++,k++){
s1->a[j]=s2->a[k];//将s2插入
}
s1->len=s1->len+x;//修改表长
}
}
void replaceStr11(seqString *s1,int i,int n,seqString *s2){//用s2代替子串s1[i]下标i开始共n个元素;
delStr(s1,i,n);//先把s1的子串下标i开始的n个字符删除;
insertStr(s1,i,s2);//再从下标i开始插入字符串d2;
}
int main(){
seqString *s;
s=initString(s);
craeteStr(s);
printStr(s);
int x;
fflush(stdin);//清除原有输入的缓冲区
printf("删除s从下标i开始的长度为n的子串,并返回删除后的字符串\n(1执行,0取消)\n");
scanf("%d",&x);
while(x!=0){
int i,n;
printf("请输入下标i和长度n\n");
scanf("%d",&i);
scanf("%d",&n);
printf("新的字符串为:\n");
delStr(s,i,n);
printStr(s);
printf("(1继续,0结束)\n");
scanf("%d",&x);
fflush(stdin);//清除原有输入的缓冲区
}
fflush(stdin);//清除原有输入的缓冲区.
seqString *s1,*s2;
printf("创建字符串s1\n");
s1=initString(s1);
craeteStr(s1);
printStr(s1);
fflush(stdin);//清除原有输入的缓冲区
printf("创建字符串s2\n");
s2=initString(s2);
craeteStr(s2);
printStr(s2);
fflush(stdin);//清除原有输入的缓冲区
printf("在s1的下标i处插入s2\n(1执行,0取消)\n");
scanf("%d",&x);
while(x!=0){
int i;
printf("请输入下标i:\n");
scanf("%d",&i);
insertStr(s1,i,s2);
printf("新的字符串为:\n");
printStr(s1);
printf("(1继续,0结束)\n");
fflush(stdin);//清除原有输入的缓冲区
scanf("%d",&x);
}
fflush(stdin);//清除原有输入的缓冲区
printf("用s2代替子串s1[i......n](下标i开始的n个元素)\n(1执行,0取消)\n");
scanf("%d",&x);
while(x!=0){
int i,n;
printf("请输入下标i,长度n:\n");
scanf("%d",&i);
scanf("%d",&n);
replaceStr(s1,i,n,s2);
printf("新的字符串为:\n");
printStr(s1);
printf("(1继续,0结束)\n");
fflush(stdin);//清除原有输入的缓冲区
scanf("%d",&x);
}
printf("谢谢!再见!\n");
return 0;
}
C语言顺序表字符串的基本操作
最新推荐文章于 2024-08-06 16:51:13 发布
本文档介绍了如何使用C语言实现顺序表结构,包括字符串的初始化、输入、输出、删除、插入及子串替换功能。通过实例展示了如何操作能储存100个字符串的顺序表,以及关键函数如`initString`、`craeteStr`、`delStr`、`insertStr`和`replaceStr`的用法。
摘要由CSDN通过智能技术生成