4假设以单链表结构表示串,每个结点数据域存放一个字符,且附设头结点。试编写算法,实现串的下列 StrAsign(S,chars) ;StrCopy(S,T) ;StrCompare( s, T) ;StrLength(S); StrCat(S, T) ;SubString( Sub ,S,pos,len)。
时间: 2024-02-25 14:54:15 浏览: 100
典型题例-串的数据结构
1. 实现 StrAssign(S, chars) 函数,将一个字符数组 chars 赋值给链式串 S。
```
void StrAssign(LinkList &S, char *chars) {
LinkList p = S->next;
int i = 0;
while (p != NULL) {
LinkList q = p;
p = p->next;
free(q);
}
S->next = NULL;
while (chars[i] != '\0') {
LinkList node = (LinkList)malloc(sizeof(LNode));
node->data = chars[i];
node->next = S->next;
S->next = node;
i++;
}
}
```
2. 实现 StrCopy(S, T) 函数,将链式串 T 复制到链式串 S。
```
void StrCopy(LinkList &S, LinkList &T) {
LinkList p = T->next, q = S;
while (p != NULL) {
LinkList node = (LinkList)malloc(sizeof(LNode));
node->data = p->data;
node->next = NULL;
q->next = node;
q = q->next;
p = p->next;
}
}
```
3. 实现 StrCompare(S, T) 函数,比较链式串 S 和 T 的大小关系。
```
int StrCompare(LinkList S, LinkList T) {
LinkList p = S->next, q = T->next;
while (p != NULL && q != NULL) {
if (p->data > q->data) {
return 1;
} else if (p->data < q->data) {
return -1;
}
p = p->next;
q = q->next;
}
if (p == NULL && q == NULL) {
return 0;
} else if (p == NULL) {
return -1;
} else {
return 1;
}
}
```
4. 实现 StrLength(S) 函数,返回链式串 S 的长度。
```
int StrLength(LinkList S) {
int len = 0;
LinkList p = S->next;
while (p != NULL) {
len++;
p = p->next;
}
return len;
}
```
5. 实现 StrCat(S, T) 函数,将链式串 T 连接到链式串 S 的末尾。
```
void StrCat(LinkList &S, LinkList &T) {
LinkList p = S;
while (p->next != NULL) {
p = p->next;
}
LinkList q = T->next;
while (q != NULL) {
LinkList node = (LinkList)malloc(sizeof(LNode));
node->data = q->data;
node->next = NULL;
p->next = node;
p = p->next;
q = q->next;
}
}
```
6. 实现 SubString(Sub, S, pos, len) 函数,将链式串 S 中从 pos 位置开始的 len 个字符复制到链式串 Sub 中。
```
void SubString(LinkList &Sub, LinkList S, int pos, int len) {
LinkList p = S->next;
int i = 1;
while (p != NULL && i < pos) {
p = p->next;
i++;
}
LinkList q = Sub;
for (int j = 0; j < len && p != NULL; j++) {
LinkList node = (LinkList)malloc(sizeof(LNode));
node->data = p->data;
node->next = NULL;
q->next = node;
q = q->next;
p = p->next;
}
}
```
注意,在这些函数的实现中,我们都使用了链表的基本操作,如链表的遍历、插入、删除等。同时,需要注意对链表的头结点进行特殊处理。
阅读全文