已知由不具有头结点的单链表表示的线性表中,含有三类字符的数据元素(字母、数字和其他字符),试编写算法构造三个以循环链表表示的线性表,使每个表中只含有同一类的字符,且利用原表中的结点空间,头结点可另辟空
时间: 2023-04-22 13:01:35 浏览: 147
间。
算法思路:
1. 定义三个循环链表,分别表示字母、数字和其他字符。
2. 遍历原链表,将每个结点根据其数据元素类型插入到对应的循环链表中。
3. 在原链表的头部插入一个新结点作为头结点,使原链表成为带头结点的单链表。
4. 返回三个循环链表的头结点。
算法实现:
```
typedef struct node {
char data;
struct node *next;
} Node;
Node *createCircularList() {
Node *head = (Node *)malloc(sizeof(Node));
head->next = head;
return head;
}
void insertNode(Node *head, char data) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->next = head->next;
head->next = newNode;
}
Node *separateList(Node *list) {
Node *letterList = createCircularList();
Node *digitList = createCircularList();
Node *otherList = createCircularList();
Node *p = list->next;
while (p != list) {
if (isalpha(p->data)) {
insertNode(letterList, p->data);
} else if (isdigit(p->data)) {
insertNode(digitList, p->data);
} else {
insertNode(otherList, p->data);
}
p = p->next;
}
list->data = 'H';
list->next = letterList;
letterList->data = 'A';
letterList->next = digitList;
digitList->data = '';
digitList->next = otherList;
otherList->data = '#';
otherList->next = list;
return letterList;
}
```
算法说明:
1. createCircularList() 函数用于创建一个空的循环链表,返回头结点指针。
2. insertNode() 函数用于在循环链表的头部插入一个新结点,数据元素为 data。
3. separateList() 函数用于将原链表中的结点按照数据元素类型分别插入到三个循环链表中,并将原链表转化为带头结点的单链表。
4. 在返回循环链表头结点之前,需要将原链表的头结点指向循环链表的第一个结点,以便于后续操作。
5. 时间复杂度为 O(n),空间复杂度为 O(1)。
阅读全文