采用合适的存储方式建立广义表,实现:1)广义表的建立;2)求广义表的长度;3)求广义表的深度;4)求广义表的表头;5)求广义表的表尾;6)广义表的输出。 用c语言实现
时间: 2024-12-18 16:11:23 浏览: 26
在C语言中,为了高效地存储和操作广义表(也称作链式列表),我们可以选择结构体和指针的方式来实现。以下是关于广义表的一些基本操作的实现:
1. **广义表建立**:
```c
typedef struct Node {
int data; // 数据域
struct Node* next; // 指向下一个节点的指针
} Node;
// 创建新节点
Node* createNode(int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = NULL;
return newNode;
}
// 构建广义表
void createList(Node** head, ...) {
va_list args;
va_start(args, head);
if (*head == NULL) {
*head = createNode(va_arg(args, int)); // 根据需要添加更多元素
} else {
Node* current = *head;
while (current->next != NULL) {
current = current->next;
}
current->next = createNode(va_arg(args, int)); // 将最后一个节点指向新节点
}
va_end(args);
}
```
2. **求广义表长度**:
```c
int getLength(Node* head) {
int count = 0;
Node* current = head;
while (current != NULL) {
count++;
current = current->next;
}
return count;
}
```
3. **求广义表深度**:
```c
int getDepth(Node* head) {
int depth = 1;
Node* current = head;
while (current->next != NULL) {
current = current->next;
depth++;
}
return depth;
}
```
4. **求表头**:
```c
Node* getHead(Node* head) {
return head;
}
```
5. **求表尾**:
这通常需要递归或栈辅助实现,因为链表没有直接提供访问表尾的便利方式。这里给出递归版本的示例:
```c
Node* getTail(Node* head) {
if (head->next == NULL) { // 如果只有一个节点,那就是表尾
return head;
}
return getTail(head->next); // 否则继续向下递归查找
}
```
6. **广义表输出**:
```c
void printList(Node* head) {
Node* current = head;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
}
```
阅读全文