C语言编写存储广义表并求得广义表的长度和深度
时间: 2024-06-16 09:07:02 浏览: 97
C语言可以使用链表来存储广义表。在链表中,每个节点可以表示一个元素或者子表。广义表的长度可以通过遍历链表并计数节点的数量来得到。而广义表的深度可以通过递归地查找子表并计算最大深度来得到。
以下是一个示例的C语言代码实现存储广义表,并求得广义表的长度和深度:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义广义表节点的结构体
typedef struct Node {
int type; // 节点类型,0表示元素,1表示子表
union {
int data; // 元素的值
struct Node* sublist; // 子表的指针
} value;
struct Node* next; // 下一个节点的指针
} Node;
// 创建一个节点
Node* createNode(int type) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->type = type;
newNode->next = NULL;
return newNode;
}
// 插入元素节点
void insertElement(Node* list, int data) {
Node* newNode = createNode(0);
newNode->value.data = data;
Node* lastNode = list;
while (lastNode->next != NULL) {
lastNode = lastNode->next;
}
lastNode->next = newNode;
}
// 插入子表节点
void insertSublist(Node* list, Node* sublist) {
Node* newNode = createNode(1);
newNode->value.sublist = sublist;
Node* lastNode = list;
while (lastNode->next != NULL) {
lastNode = lastNode->next;
}
lastNode->next = newNode;
}
// 计算广义表的长度
int getLength(Node* list) {
int length = 0;
Node* currentNode = list->next;
while (currentNode != NULL) {
length++;
currentNode = currentNode->next;
}
return length;
}
// 递归地计算广义表的深度
int getDepth(Node* list) {
int maxDepth = 0;
Node* currentNode = list->next;
while (currentNode != NULL) {
if (currentNode->type == 1) { // 子表节点
int depth = getDepth(currentNode->value.sublist);
if (depth > maxDepth) {
maxDepth = depth;
}
}
currentNode = currentNode->next;
}
return maxDepth + 1;
}
int main() {
// 创建一个广义表 ((1, 2), (3, 4, 5))
Node* list = createNode(1);
Node* sublist1 = createNode(1);
insertElement(sublist1, 1);
insertElement(sublist1, 2);
Node* sublist2 = createNode(1);
insertElement(sublist2, 3);
insertElement(sublist2, 4);
insertElement(sublist2, 5);
insertSublist(list, sublist1);
insertSublist(list, sublist2);
// 计算广义表的长度和深度
int length = getLength(list);
int depth = getDepth(list);
printf("广义表的长度为:%d\n", length);
printf("广义表的深度为:%d\n", depth);
return 0;
}
```
阅读全文