链式串的定义
跟链表一样
typedef struct node
{
char data;
struct node *next;
} linkstrnode;
操作实现
尾插法建立单链表
void strcreate(linkstrnode **S)
{
char ch;
linkstrnode* p;
linkstrnode*r; //p用来生成新节点
*S = NULL; r = NULL; //r是尾结点,S指向头节点,
r = *S; //开始是r和S是同一个节点
while ((ch = getchar()) != '\n')
{
p = (linkstrnode *)malloc(sizeof(linkstrnode));
p->data = ch; //产生新结点
if (*S == NULL) /*新结点插入空表*/
*S = p;
else r->next = p;
r = p;
} /*处理表尾结点指针域*/
if (r != NULL) r->next = NULL;
}
输出单链表的内容
void outlinkstring(linkstrnode* head)
{
linkstrnode *p;
p = head;
while (p)
{
printf("%c-->", p->data);
p = p->next;
}
printf("\n");
}
将串T插入到串S中第i个字符之前
void strinsert(linkstrnode**S, int i, linkstrnode* T)
{
int k;
linkstrnode* p;
linkstrnode* q;
p = *S, k = 1;
while (p && k < i - 1)
{
p = p->next;
k++;
}
if (!p) printf("error\n");
else
{
q = T;
while (q->next) q = q->next;
q->next = p->next;
p->next = T;
}
}
删除串s中第i个字符后的len个字符
void strdelete(linkstrnode* *S, int i, int len)
{
int k;
linkstrnode* p;
linkstrnode* q;
linkstrnode* r;
p = *S, q = null; k = 1;
while (p && k < i)
{
q = p; p = p->next; k++;
}
if (!p) printf("error1\n");
else
{
k = 1;
while (k < len && p)
{
p = p->next; k++;
}
if (!p) printf("error2\n");
else
{
if (!q) { r = *S; *S = p->next; }
else
{
r = q->next; q->next = p->next;
}
p->next = null;
while (r != null)
{
p = r; r = r->next; free(p);
}
}
}
}
串的连接
void strconcat(linkstrnode**S1, linkstrnode* S2)
{
linkstrnode* p;
if (!(*S1))
{
*S1 = S2;
return;
}
else
if (S2)
{
p = *S1;
while (p->next) p = p->next;
p->next = S2;
}
}
求子串
linkstrnode* substring(linkstrnode* S, int i, int len)
//此过程里r保存的是子串信息,p是主串信息,t是取到的每个结点的信息临时保存,
{
int k; //计数器
linkstrnode* p;
linkstrnode* q;
linkstrnode* r;
linkstrnode* t;
p = S;
k = 1;
while (p && k < i) { p = p->next; k++; } //将p的指针定位到第i个结点
if (!p) {
printf("empty error\n");
return(null);
}
else{
r = (linkstrnode*)malloc(sizeof(linkstrnode));
r->data = p->data;
r->next = null; //把第i个结点赋值给r
k = 1; //计数器归1
q = r;//r和q指向同一个地址
while (p->next && k < len)
{
p = p->next;
k++;
t = (linkstrnode*)malloc(sizeof(linkstrnode));
t->data = p->data;
q->next = t;
q = t;
}
if (k < len) {
printf("len error\n");
return(null);
}else
{
q->next = null;
return(r);
}
}
}