假设以单链表结构表示串,每个结点数据域存放一个字符,且附设头结点。是编写算法,实现串的下列操作:StrAsign(S,chars);StrCopy(S,T);StrCompare(S,T);StrLength(S);StrCat(S,T);SubString(Sun,S,pos,len)。C语言
时间: 2023-11-18 10:03:38 浏览: 179
好的,我会根据你的要求回答问题。下面是针对单链表结构表示串的算法实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义单链表结点
typedef struct LNode {
char data;
struct LNode *next;
} LNode, *LinkList;
// 初始化链表
void InitList(LinkList *L) {
*L = (LinkList)malloc(sizeof(LNode));
(*L)->next = NULL;
}
// 生成链表
void CreateList(LinkList L, char *chars) {
int i, len = strlen(chars);
LinkList p = L;
for (i = 0; i < len; i++) {
LinkList q = (LinkList)malloc(sizeof(LNode));
q->data = chars[i];
q->next = NULL;
p->next = q;
p = q;
}
}
// 拷贝链表
void CopyList(LinkList S, LinkList *T) {
LinkList p = S->next, q, r;
InitList(T);
r = *T;
while (p) {
q = (LinkList)malloc(sizeof(LNode));
q->data = p->data;
q->next = NULL;
r->next = q;
r = q;
p = p->next;
}
}
// 比较链表
int CompareList(LinkList S, LinkList T) {
LinkList p = S->next, q = T->next;
while (p && q) {
if (p->data != q->data)
return p->data - q->data;
p = p->next;
q = q->next;
}
return p == NULL && q == NULL ? 0 : (p == NULL ? -1 : 1);
}
// 获取链表长度
int GetListLength(LinkList L) {
int len = 0;
LinkList p = L->next;
while (p) {
len++;
p = p->next;
}
return len;
}
// 连接链表
void ConcatList(LinkList S, LinkList T) {
LinkList p = S;
while (p->next)
p = p->next;
p->next = T->next;
free(T);
}
// 截取链表
void SubList(LinkList S, LinkList *Sub, int pos, int len) {
int i;
LinkList p = S->next, q, r;
InitList(Sub);
r = *Sub;
for (i = 1; i < pos && p; i++) {
q = (LinkList)malloc(sizeof(LNode));
q->data = p->data;
q->next = NULL;
r->next = q;
r = q;
p = p->next;
}
for (i = 0; i < len && p; i++) {
q = (LinkList)malloc(sizeof(LNode));
q->data = p->data;
q->next = NULL;
r->next = q;
r = q;
p = p->next;
}
}
```
以上是对应的算法实现,下面是主函数的调用:
```c
int main() {
LinkList S, T, Sub;
// 初始化链表
InitList(&S);
InitList(&T);
InitList(&Sub);
// 生成链表
char chars[] = "hello world";
CreateList(S, chars);
CreateList(T, "hello everyone");
// 拷贝链表
CopyList(S, &T);
// 比较链表
int res = CompareList(S, T);
printf("CompareList: %d\n", res);
// 获取链表长度
int len = GetListLength(S);
printf("GetListLength: %d\n", len);
// 连接链表
ConcatList(S, T);
printf("ConcatList: ");
LinkList p = S->next;
while (p) {
printf("%c", p->data);
p = p->next;
}
printf("\n");
// 截取链表
SubList(S, &Sub, 3, 5);
printf("SubList: ");
p = Sub->next;
while (p) {
printf("%c", p->data);
p = p->next;
}
printf("\n");
return 0;
}
```
以上代码可以实现串的生成、拷贝、比较、获取长度、连接和截取等操作。
阅读全文