用c++写出广义表表头、表尾识别器 (1) 建立广义表(2)输出广义表(3)结点的查找(4)求广义表表头(S)求广义表表尾
时间: 2024-11-28 12:18:54 浏览: 18
数据结构习题解析-面向对象方法和C++语言描述-殷人昆.
在 C++ 中,我们可以使用结构体来表示广义表的节点,并结合栈数据结构来实现广义表的表头、表尾识别。这里是一个简单的示例,首先定义广义表节点:
```cpp
#include <iostream>
using namespace std;
struct Node {
int data;
Node* tail; // 指向下一个元素,如果是最后一个元素则指向NULL
};
// 创建新节点
Node* createNode(int value) {
Node* newNode = new Node();
newNode->data = value;
newNode->tail = nullptr;
return newNode;
}
// 插入节点到表尾
void appendToList(Node** head, int value) {
if (*head == nullptr) {
*head = createNode(value);
} else {
Node* current = *head;
while (current->tail != nullptr) {
current = current->tail;
}
current->tail = createNode(value);
}
}
// 输出广义表
void printList(Node* head) {
if (head == nullptr) {
cout << "Empty list." << endl;
} else {
Node* temp = head;
while (temp != nullptr) {
cout << temp->data << " ";
temp = temp->tail;
}
cout << endl;
}
}
// 表头识别:返回第一个非空节点
Node* getHead(Node* head) {
while (head != nullptr && head->data == 0) { // 如果值为0代表表头
head = head->tail;
}
return head;
}
// 表尾识别:递归遍历直到找到尾部节点
Node* getTail(Node* head) {
if (head == nullptr || head->tail == nullptr) {
return head;
} else {
return getTail(head->tail);
}
}
int main() {
Node* list = nullptr;
// 示例:建立广义表 [1, 0, 2, 0, 3]
appendToList(&list, 1);
appendToList(&list, 2);
appendToList(&list, 3);
// 输出广义表
printList(list);
// 求广义表表头(S)
Node* head = getHead(list);
if (head == nullptr) {
cout << "No elements in the list." << endl;
} else {
cout << "Table head: " << head->data << endl;
}
// 求广义表表尾
Node* tail = getTail(list);
cout << "Table tail: " << tail->data << endl;
return 0;
}
```
阅读全文