由代码知道,题主使用的是单向链表,即上一节点指向下一节点,下一节点只指向下下一节点。
成都创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于网站设计、成都网站建设、济水街道网络推广、小程序定制开发、济水街道网络营销、济水街道企业策划、济水街道品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联公司为所有大学生创业者提供济水街道建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com
如果不要尾节点也是可以的,首先解释为什么可以,不要尾节点之后要怎么做:
不要尾节点,通过头节点也是可以达到尾部的。但是如果需要在链表尾部加入数据,就需要从头开始遍历链表来达到尾部,然后再做上面代码中的操作把新节点放到尾部。这个是可以的,但是从一个设计者的角度来说,如果链表过长,比如10W+,那么每次遍历开销很大的,而如果记录了尾节点就不需要每次都遍历,只需操作尾节点。
如果不要头节点行吗,显然是不可以的,因为尾部没有指向上一节点的指针,会找不到头,那么链表就只能访问一个尾节点并且造成内存泄露,如下图,节点方向示意图,试着去掉head或者tail标识,你会更快明白的。
head-----------------------------tail
【】-【】-........-【】-【】
广义表定义:第一个元素为表头,其余元素组成的表(重点是元素组成的 “表”)
head((a,b),(c,d))=(a,b)==取表头第一个元素;
tail(head((a,b),(c,d)))即tail(a,b)==(b),根据广义表表尾定义为(b),不是b.
如理解的不对请指出。
以第5题为例啊
tail(L) 得到的是(a,(u,t,w))
tail(tail(L)) 得到的就是((u,t,w))
head(tail(tail(L)))得到的就是(u,t,w)
tail(getHead(tail(tail(L))))得到的就是((t,w))
head(tail(head(tail(tail(L)))))得到的就是(t,w)
head(head(tail(head(tail(tail(L))))))得到的就是t.
#include stdio.h
#include string.h
#include ctype.h
int count_word(const char * sentense, const char * word, int caseless)
{
int number = 0;
const char * p, * current = sentense;
int head, tail;
int len = strlen(sentense);
//printf("len:%d\n", len);
while (1) {
//printf("c: %s\n", current);
if (caseless)
p = strcasestr(current, word);
else
p = strstr(current, word);
if (p == NULL)
break;
// check if it's a word
head = p - sentense;
tail = head + strlen(word);
//printf("p: %s\n", p);
//printf("head: %d\n", head);
//printf("tail: %d\n", tail);
if ( (head == 0 || !isalpha(sentense[head-1]))
(tail == len || !isalpha(sentense[tail]))) {
number++;
//printf(" num++\n");
}
current = p + strlen(word);
}
return number;
}
int main()
{
int n = count_word("It's a nice day today, isn't it? . leave it alone! got it", "it", 1);
printf("%d\n", n);
return 0;
}
售后响应及时
7×24小时客服热线数据备份
更安全、更高效、更稳定价格公道精准
项目经理精准报价不弄虚作假合作无风险
重合同讲信誉,无效全额退款