广义表的表头和表尾是什么?

广义表((a,b),c,d)表头和表尾分别是什么?

 

亲们,大部分同学碰到广义表就痛不欲生,其实我想说的是:世上那么多一点都不懂广义表的人都活得那么开心,你还有啥过不过去的。

请看我的公式:

(1)表头:当广义表LS非空时,称第一个元素为LS的表头;

(2)表尾:称广义表LS中除去表头后其余元素组成的广义表为LS的表尾。

有的同学上面的(1)(2)看的太快,没有发现表头和表尾的区别。

重点说三遍:表头是元素,表尾是广义表。

重点说三遍:表头是元素,表尾是广义表。

重点说三遍:表头是元素,表尾是广义表。

 

亲,我要举个栗子了。

广义表(a, (b))的表头是单元素a,表尾是广义表((b))。【亲要在(b)的外面加一层小括号,才能变成广义表。因此是((b))  】

 

亲,我要再举个栗子了。

广义表(a)的表头是单元素a,表尾是广义表(),哇塞,为啥是(),不是空呢?明明a后面没有元素了。想想表尾一定是个广义表。潜台词就是一定带(),没有元素就有一个孤零零的()好了。

 

亲,我要再举个栗子了。

广义表(a, b, c)的表头是单元素a,表尾是广义表(b,c)。

好了,到现在,其实你已经清楚了,广义表的表头是单元素,表尾是个广义表。

 

 总结总结总结: 根据广义表对表头和表尾的定义可知:

(1)对任意一个非空的广义表,其表头可能是单元素,也可能是广义表,

(2)而其表尾一定是广义表。

(3)注意表尾的深度(即括号的嵌套层数)

(4)表尾是由除了表头以外的其余元素组成的广义表,所以,需要在表尾的直接元素外面再加一层括号。

 

 

来验证自己学习的怎么样了吧?

 求广义表的表头和表尾是广义表的基本操作,给定一个广义表,可以将某个单元素通过表头和表尾求出。

已知广义表L=(a,(b,(c,(d)), e), f )

  ⑴ L1=Tail(L)=((b,(c,(d)), e), f )

  ⑵ L2=Head(L1)= (b,(c,(d)), e)

  ⑶ L3=Tail(L2)=((c,(d)), e)

  ⑷ L4=Head(L3)=(c,(d))

  ⑸ L5=Head(L4)= c

如果以上5个都正确,那么恭喜你已经掌握了广义表的头和尾了。

  • 542
    点赞
  • 715
    收藏
    觉得还不错? 一键收藏
  • 57
    评论
创建广义表表头表尾需要涉及到链表的概念。表头广义表的第一个节点,包含指向表尾的指针和指向第一个元素的指针。表尾是指最后一个元素的节点,包含指向下一个元素的指针和指向表头的指针。以下是具体的创建方法: 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()`用于将节点加入广义表表尾
评论 57
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值