实现将线性表分割为三个循环链表,每个循环链表表示的线性表中只含一类字符。
算法思想: 首先定义了表示节点和循环链表的结构,并实现了初始化循环链表和节点插入操作的函数。然后在`main`函数中,我们创建了表示线性链表和三个循环链表的指针,并调用`splitList`函数将线性表分割为三个循环链表。
#include <stdio.h>
#include <stdlib.h>
// 定义线性链表节点结构
typedef struct Node {
char data; // 数据域
struct Node *next; // 指针域
} Node;
// 初始化一个循环链表
void initCircularList(Node **head) {
*head = (Node *)malloc(sizeof(Node));
(*head)->next = *head;
}
// 将一个节点插入到循环链表的尾部
void insertNode(Node *head, char data) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->next = head->next;
head->next = newNode;
}
// 分割线性表为三个循环链表
void splitList(Node *linearList, Node **charList, Node **digitList, Node **otherList) {
Node *p = linearList->next; // 指向第一个数据结点
while (p != linearList) {
// 根据数据类型插入到对应的循环链表中
if (isalpha(p->data)) {
insertNode(*charList, p->data);
} else if (isdigit(p->data)) {
insertNode(*digitList, p->data);
} else {
insertNode(*otherList, p->data);
}
p = p->next; // 继续处理下一个节点
}
}
int main() {
Node *linearList = (Node *)malloc(sizeof(Node)); // 假设已经创建并初始化了线性链表
Node *charList, *digitList, *otherList;
initCircularList(&charList);
initCircularList(&digitList);
initCircularList(&otherList);
// 调用分割函数,将线性表分割为三个循环链表
splitList(linearList, &charList, &digitList, &otherList);
return 0;
}