链串子串
程序员文章站
2024-02-24 22:17:34
...
//链串中秋子串运算
#include <stdio.h>
#include <stdlib.h>
typedef struct snode
{
char data;
struct snode *next;
}LiString; //链串节点类型
void StrAssingn(LiString **s, char str[]) //尾插法建立链串
{
LiString *p, *r;
int i;
*s = (LiString *)malloc(sizeof(LiString)); //建立链串头节点
r = *s; //r 始终指向链串s 的尾节点
for (i = 0; str[i] != '\0'; i++) //将数组str 中的字符逐个转化为链串s 中的节点
{
p = (LiString *)malloc(sizeof(LiString));
p->data = str[i];
r->next = p;
r = p;
}
r->next = NULL; //将最终生成的链串s 尾节点的指针置为空
}
int StrLength(LiString *s)
{
int i = 0;
LiString *p = s->next; //使p 指向链串s 的第一个数据节点
while (p != NULL)
{
i++;
p = p->next;
}
return i; //返回串长度值
}
void SubStr(LiString *s, LiString **str, int i, int len)
{ //对链串s 求子串并存放于链串str中
LiString *p, *q, *r;
int k;
p = s->next; //p 指向链串s 的第一个数据节点
*str = (LiString *)malloc(sizeof(LiString)); //生成链串*str 的头节点
(*str)->next = NULL;
r = *str; //r 指向链串*str的尾节点
if (i < 1 || i > StrLength(s) || len < 0 || i + len - 1 > StrLength(s))
{
goto L1; //参数错误,生成空链串*str
}
for (k = 0; k < i - 1; k++)
{
p = p->next; //p 定位于链串s 的第一个节点
}
for (k = 0; k < len; k++) //将链串s 由第i 个节点开始的len 个节点复制到链串str 中
{
q = (LiString *)malloc(sizeof(LiString)); //生成一个由q 指向的节点
q->data = p->data;
r->next = q;
r = q;
p = p->next;
}
r->next = NULL;
L1: ;
}
int main()
{
LiString *head1, *head2, *p;
char c1[20] = "ABCDabD";
StrAssingn(&head1, c1);
SubStr(head1, &head2, 3, 3); //对链串head1 求子串并存放在链串head2 中
p = head2->next;
while (p != NULL)
{
printf("%2c", p->data);
p = p->next;
}
printf("\n");
return 0;
}
上一篇: 寒假集训个人赛 D
下一篇: 密码脱落(区间dp,最长公共子序列)