#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAXLEN 255 typedef struct{ char ch[MAXLEN]; int length; }SString; bool SubString(SString &sub,SString S,int pos,int len){ if(pos+len-1>S.length) return false; for(int i = pos;i<pos+len;i++) sub.ch[i-pos+1]=S.ch[i]; sub.length=len; return true; } //串比较 int StrCompare(SString S,SString T){ for(int i=1;i<=S.length&&i<=T.length;i++){ if(S.ch[i]!=T.ch[i]) printf("%d",S.ch[i]-T.ch[i]); } printf("%d",S.length-T.length); } //求串长 int StrLength(SString S){ return S.length; } //定位 int Index(SString S,SString T){ int i=1,n=StrLength(S),m=StrLength(T); SString sub; while(i<n-m+1){ SubString(sub,S,i,m); if(StrCompare(T,sub)!=0) ++i; else return i; } return 0; } //打印字符串 void printSString(SString str) { int i; for(i=1;i<=str.length;i++) printf("%c",str.ch[i]); printf("\n"); } int main(){ SString A; A.ch[1]='a'; A.ch[2]='b'; A.ch[3]='c'; A.ch[4]='d'; A.ch[5]='e'; A.ch[6]='f'; A.ch[7]='g'; A.ch[8]='h'; A.ch[9]='i'; A.length = 9; SString B; B.ch[1]='a'; B.ch[2]='b'; B.ch[3]='c'; B.ch[4]='d'; B.ch[5]='e'; B.length = 5; Index(A,B); }
时间: 2023-10-24 14:05:48 浏览: 104
这段代码是一个简单的串操作代码,主要包括子串获取、串比较、求串长和定位等功能。代码中定义了一个结构体SString来表示字符串,通过定义不同的函数来实现不同的操作。
函数SubString用于获取字符串S中从位置pos开始长度为len的子串,并存储在结构体sub中。
函数StrCompare用于比较两个字符串S和T,依次比较对应位置上的字符,如果不相等则输出它们的ASCII码差值,如果长度不相等则输出它们的长度差值。
函数StrLength用于求字符串S的长度。
函数Index用于在字符串S中定位字符串T第一次出现的位置,通过循环遍历S中所有可能的子串,并与T比较,如果找到相等的子串则返回其起始位置。
在main函数中,创建了两个SString类型的字符串A和B,并给它们赋初值。然后调用Index函数,在字符串A中查找字符串B第一次出现的位置。
最后,需要注意的是代码中存在一些问题,比如在函数StrCompare的循环中没有加上循环条件判断,函数Index中的循环条件应该是i<n-m+1而不是i<=n-m+1。此外,在main函数最后没有返回值。
相关问题
以不同的方式改写#include <stdio.h> #include <stdlib.h> #define MAXLEN 100 typedef char DataType; typedef struct { DataType data[MAXLEN]; int length; } SeqBTree; void InitSeqBiTree(SeqBTree* T) { T->length = 0; } void CreateSeqBTree(SeqBTree* T) { int i; printf("请按顺序输入完全二叉树的节点:"); for (i = 1; i <= T->length; i++) { scanf_s(" %c", &T->data[i]); } } void ShowSeqBTree(SeqBTree* T) { int i = 1; int k; printf("输入完全二叉树(格式:双亲节点:左孩子,右孩子))\n"); while (i <= T->length) { printf("%c:", T->data[i]); if (2 * i <= T->length) printf("%c,", T->data[2 * i]); else printf(" ,"); if (2 * i + 1 <= T->length) printf("%c\n", T->data[2 * i + 1]); else printf(" \n"); i++; } } int main() { SeqBTree T; int n; InitSeqBiTree(&T); printf("请输入完成二叉树的节点个数:"); scanf_s("%d", &n); T.length = n; CreateSeqBTree(&T); ShowSeqBTree(&T); }这个代码
#include <stdio.h>
#include <stdlib.h>
#define MAXLEN 100
typedef char DataType;
typedef struct {
DataType data[MAXLEN];
int length;
} SeqBTree;
void InitSeqBiTree(SeqBTree* T) {
T->length = 0;
}
void CreateSeqBTree(SeqBTree* T) {
int i;
printf("请按顺序输入完全二叉树的节点:");
for (i = 1; i <= T->length; i++) {
scanf_s(" %c", &T->data[i]);
}
}
void ShowSeqBTree(SeqBTree* T) {
int i = 1;
int k;
printf("输入完全二叉树(格式:双亲节点:左孩子,右孩子))\n");
while (i <= T->length) {
printf("%c:", T->data[i]);
if (2 * i <= T->length)
printf("%c,", T->data[2 * i]);
else
printf(" ,");
if (2 * i + 1 <= T->length)
printf("%c\n", T->data[2 * i + 1]);
else
printf(" \n");
i++;
}
}
int main() {
SeqBTree T;
int n;
InitSeqBiTree(&T);
printf("请输入完成二叉树的节点个数:");
scanf_s("%d", &n);
T.length = n;
CreateSeqBTree(&T);
ShowSeqBTree(&T);
return 0;
}
改进一下#include <stdio.h> #include <stdlib.h> #define MAXLEN 100 typedef char DataType; typedef struct { DataType data[MAXLEN]; int length; //第一个属性 }SeqBTree; void InitSeqBiTree(SeqBTree* T) { T->length = 0; } void CreateSeqBTree(SeqBTree* T) { int i; char ch; printf("请按顺序输入完全二叉树的节点:"); for (i = 1; i <= T->length; i++) { T->data[i] = getchar(); } } void ShowSeqBTree(SeqBTree* T) { int i = 0; int k; printf("输入完全二叉树(格式:双亲节点:左孩子,右孩子))\n"); for (i = 1; i <= T->length; i++) { printf("%c:", T->data[i]); k = 2 * i; if (2 * i <= T->length) printf("%c,", T->data[2 * i]); else printf(" ,"); if (2 * i + 1 <= T->length) printf("%c\n", T->data[2 * i + 1]); else printf(" \n"); } } int main() { SeqBTree T; int n; InitSeqBiTree(&T); printf("请输入完成二叉树的节点个数:"); scanf_s("%d", &n); getchar(); T.length = n; CreateSeqBTree(&T); ShowSeqBTree(&T); }
改进的代码如下,主要是修正了输入节点的方式和遍历节点的方式,保证了正确性:
```
#include <stdio.h>
#include <stdlib.h>
#define MAXLEN 100
typedef char DataType;
typedef struct {
DataType data[MAXLEN];
int length;
} SeqBTree;
void InitSeqBiTree(SeqBTree* T) {
T->length = 0;
}
void CreateSeqBTree(SeqBTree* T) {
int i;
char ch;
printf("请按顺序输入完全二叉树的节点:");
for (i = 1; i <= T->length; i++) {
scanf(" %c", &T->data[i]);
}
}
void ShowSeqBTree(SeqBTree* T) {
int i = 1;
int k;
printf("输入完全二叉树(格式:双亲节点:左孩子,右孩子))\n");
while (i <= T->length) {
printf("%c:", T->data[i]);
if (2 * i <= T->length)
printf("%c,", T->data[2 * i]);
else
printf(" ,");
if (2 * i + 1 <= T->length)
printf("%c\n", T->data[2 * i + 1]);
else
printf(" \n");
i++;
}
}
int main() {
SeqBTree T;
int n;
InitSeqBiTree(&T);
printf("请输入完成二叉树的节点个数:");
scanf("%d", &n);
T.length = n;
CreateSeqBTree(&T);
ShowSeqBTree(&T);
}
```
阅读全文