C语言广义表如何创建表头和表尾
时间: 2023-09-24 12:13:58 浏览: 98
创建广义表的表头和表尾需要涉及到链表的概念。表头是广义表的第一个节点,包含指向表尾的指针和指向第一个元素的指针。表尾是指最后一个元素的节点,包含指向下一个元素的指针和指向表头的指针。以下是具体的创建方法:
1. 创建表头节点,包含指向表尾和第一个元素的指针,其中表尾指针为空,第一个元素指针指向NULL。
2. 以链表的方式逐个创建广义表的元素节点,将每个元素节点的指针指向下一个元素节点,直到创建完最后一个元素节点。
3. 创建表尾节点,包含指向表头和下一个元素的指针,其中下一个元素指针指向第一个元素节点。
4. 将表头节点的表尾指针指向表尾节点,完成广义表的创建。
代码示例:
```c
typedef struct node{
int tag; // 节点类型,0表示元素节点,1表示子表节点
union{
int data; // 元素节点的值
struct node *sublist; // 子表节点的指针
} value;
struct node *next; // 指向下一个节点
} GLNode, *GList;
// 创建表头节点和表尾节点
GList createGList() {
GList head = (GList)malloc(sizeof(GLNode));
GList tail = (GList)malloc(sizeof(GLNode));
head->tag = tail->tag = 1;
head->value.sublist = tail->value.sublist = NULL;
head->next = tail;
tail->next = head;
return head;
}
// 创建元素节点
GList createGLNode(int data) {
GList node = (GList)malloc(sizeof(GLNode));
node->tag = 0;
node->value.data = data;
node->next = NULL;
return node;
}
// 将元素节点加入广义表的表尾
void insertGLNode(GList tail, int data) {
GList node = createGLNode(data);
node->next = tail;
GList p = tail->next;
while (p->next != tail) {
p = p->next;
}
p->next = node;
}
// 创建子表节点并逐个加入元素节点
GList createSublist(int *data, int len) {
GList sublist = createGList();
for (int i = 0; i < len; i++) {
insertGLNode(sublist, data[i]);
}
return sublist;
}
// 将子表节点加入广义表的表尾
void insertSublist(GList tail, int *data, int len) {
GList sublist = createSublist(data, len);
sublist->next = tail;
GList p = tail->next;
while (p->next != tail) {
p = p->next;
}
p->next = sublist;
}
```
以上示例代码实现了广义表的创建,可以通过调用`createGList()`、`insertGLNode()`和`insertSublist()`函数来实现。其中,`createGLNode()`用于创建元素节点,`createSublist()`用于创建子表节点并逐个加入元素节点。`insertGLNode()`和`insertSublist()`用于将节点加入广义表的表尾。