当前位置: 首页 > news >正文

C语言数据结构(3)----无头单向非循环链表

目录

1. 链表的概念及结构

2. 链表的分类

3. 无头单向非循环链表的实现(下面称为单链表)

3.1 SListNode* BuySListNode(SLTDateType x) 的实现

 3.2 void SListPrint(SListNode* plist) 的实现

3.3 void SListPushBack(SListNode** pplist, SLTDateType x) 的实现

3.4 void SListPushFront(SListNode** pplist, SLTDateType x) 的实现

3.5 void SListPopBack(SListNode** pplist) 的实现

3.6 void SListPopFront(SListNode** pplist) 的实现

3.7 SListNode* SListFind(SListNode* plist, SLTDateType x) 的实现

3.8 void SListInsertAfter(SListNode* pos, SLTDateType x) 的实现

3.9 void SListEraseAfter(SListNode* pos) 的实现

3.10 void SListDestroy(SListNode* plist) 的实现

4. 题目练习

4.1 链表中的倒数第 K 个节点

4.2 环形链表 Ι && 环形链表 Ⅱ

4.3 反转链表

4.4 合并两个有序链表


1. 链表的概念及结构

概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表
中的指针链接次序实现的 。

 链表的逻辑结构其实和上面的通过连接头连接起来的火车车厢差不多。

 注意:

1:从上图中可以看出,链式结构在逻辑上是连续的,但是在物理上不一定连续(程序中表现为每个节点在堆上的内存是不连续的)

2:现实中的节点一般都是从堆上申请出来的。

3:从堆上申请的空间,是按照一定的策略来分配的,两次申请的空间可能连续,也可能不连续。

2. 链表的分类

实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:
1. 单向或者双向

 2. 带头或者不带头

 3. 循环和不循环

八种结构是怎么来的呢?需要数学基础哈,这里就不多说了。组合一下!!

虽然说链表有这么多中,但是我们最常用的是两种哈!

1:无头单向非循环链表。

2:带头双向循环链表。

 1. 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结
构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。
2. 带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都
是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带
来很多优势,实现反而简单了,后面我们代码实现了就知道了。

3. 无头单向非循环链表的实现(下面称为单链表)

// slist.h
typedef int SLTDateType;
typedef struct SListNode
{SLTDateType data;struct SListNode* next;
}SListNode;// 动态申请一个节点
SListNode* BuySListNode(SLTDateType x);
// 单链表打印
void SListPrint(SListNode* plist);
// 单链表尾插
void SListPushBack(SListNode** pplist, SLTDateType x);
// 单链表的头插
void SListPushFront(SListNode** pplist, SLTDateType x);
// 单链表的尾删
void SListPopBack(SListNode** pplist);
// 单链表头删
void SListPopFront(SListNode** pplist);
// 单链表查找
SListNode* SListFind(SListNode* plist, SLTDateType x);
// 单链表在pos位置之后插入x
// 分析思考为什么不在pos位置之前插入?
void SListInsertAfter(SListNode* pos, SLTDateType x);
// 单链表删除pos位置之后的值
// 分析思考为什么不删除pos位置?
void SListEraseAfter(SListNode* pos);
// 单链表的销毁
void SListDestroy(SListNode* plist);

3.1 SListNode* BuySListNode(SLTDateType x) 的实现

为啥要将开辟一个新节点封装成函数嘞,因为在单链表的尾插,头插,指定位置后面插入均需要开辟新的节点,如果我们将开辟节点封装成一个函数,就可以少写几行代码,调用函数就阔以啦!

参数列表中的 x 用来初始化向堆区申请的节点。

//动态申请一个节点
SListNode* BuySListNode(SLTDateType x)
{//开辟节点SListNode* newNode = (SListNode*)malloc(sizeof(SListNode));//返回的指针可能为空,判断一下if (newNode == NULL){perror("BuyNewNode::malloc");exit(-1);}else{//将值初始化,newNode->next初始化为NULL是很有必要的//可以通过后面对该函数的使用来体会。newNode->data = x;newNode->next = NULL;}
}

 3.2 void SListPrint(SListNode* plist) 的实现

参数 plist 是指向第一个结点的指针哈!

这里就有一个小小的问题,在写顺序表的代码时,我们常常对传入的指针进行断言,这里呢到底需不需要断言 plist 指针呢?这里是没有必要的哈,根据顺序表的结构,传入的指针指向的结构体里面存储的是 堆上开辟的数组的指针,如果传入的指针为空,我们尝试去访问顺序表中的数据,就会发生空指针的解引用引起程序崩溃!

 再看链表,一个节点就是一个数据,当 plist 传入空指针时,就说明了此时单链表为空,直接打印一个NULL就行,或者啥都不打印。故不需要断言 plist 指针。

总结:断言可以确保指针的合法使用,如果程序可能出现非法使用指针,则需要断言,不妨称之为暴力检查;或者用 if 进行判断,不妨称之为温柔的检查。不知道 uu 们喜欢哪一种呢?

打印数据就创建一个指针 cur,初始化为 plist,用 cur 指针遍历链表中的数据,直到 cur 为空为止。

//打印单链表
void SListPrint(SListNode* plist)
{//初始化cur指针SListNode* cur = plist;//循环遍历while (cur != NULL){//生动的显示链表的结构打印一个 ->printf("%d->", cur->data);cur = cur->next;}//链表的尾节点指向 NULLprintf("NULL");printf("\n");
}

3.3 void SListPushBack(SListNode** pplist, SLTDateType x) 的实现

这里需要注意的一个点就是为啥传二级指针哈(C++传一级指针加引用也行的哦)。了解了函数栈帧的创建和销毁之后印象最深刻的结论就是这个吧:形参只是实参的临时拷贝,形参的改变不会影响实参。

如果有不理解的地方请参考:http://t.csdn.cn/SYcAp

好的,理解了这个我们就来尝试理解为啥要传二级指针哈。

假设我们传入的是一级指针:当我们的链表为空时,指向第一个节点的指针 plist 就是 NULL,这时我们将 plist 传入 SListPushBack 函数,尾插嘛,需要新节点,调用上面的 BuySListNode 函数即可。既然插入了一个节点,当然是需要改变 plist 的值的。我们直接将该函数返回的新节点的指针赋值给 plist,这能达到改变 plist 的目的吗?

显然是不能的。下图是传入一级指针尾插数据打印后的结果:

这是为啥呢?

 一级指针不行为啥二级指针就行嘞?

 那好,在弄清楚了这个问题,我们就可以得出结论:当我们需要改变 plist 的值时就必须传入plist的地址。

尾插还会分两种情况,当单链表中没有节点时,我们只需要将 newNode 赋值给 *pplist,如果说有节点的话,就需要找到单链表中的尾节点 tail,然后令 tail -> next = newNode即可。还是比较好理解的哈。真正难理解的是二级指针那里呢!!

//单链表的尾插
void SListPushBack(SListNode** pplist, SLTDateType x)
{assert(pplist);SListNode* newNode = BuySListNode(x);//链表中没有节点,直接赋值即可if (*pplist == NULL){*pplist = newNode;}else{//这里是找尾节点SListNode* tail = *pplist;while (tail->next != NULL){tail = tail->next;}//连接新的节点tail->next = newNode;}
}

3.4 void SListPushFront(SListNode** pplist, SLTDateType x) 的实现

头插和尾插差不多的哦,头插同样要改变 plist 的值所以也需要传 plist 的地址哦!头插就简单啦:直接让 newNode -> next = *pphead 就行,链表的增删改查函数,你就先想一般的情况,然后嘞在看看有没有特殊的情况,比如说:链表为空,只有一个节点啥的呀,这样就能分析出需不需要把一种情况单独拿出来处理。显然这个头插函数是不需要的哦!

//单链表的头插
void SListPushFront(SListNode** pplist, SLTDateType x)
{assert(pplist);SListNode* newNode = BuySListNode(x);newNode->next = *pplist;*pplist = newNode;
}

3.5 void SListPopBack(SListNode** pplist) 的实现

尾删的话,肯定没有数据的话是不让删的,需要断言 *pplist。同样可能改变 plist 需要传入 plist 的地址哦!

尾删有两种思路的哦!

1:双指针

 根据上面说的链表函数接口的写法,我们把一般的情况写出来了,就得看看有没有特殊的情况捏,显然是有的哦,当链表只有一个节点时,这个程序会崩溃的!当只有一个节点时         (*plplist)->next 就是空,无法进入循环,prev也就是 NULL,prev->next = NULL,这行代码就会发生空指针的解引用,程序会崩溃的!所以需要单独处理只有一个节点的情况。

void SListPopBack(SListNode** pplist)
{assert(*pplist);assert(pplist);if ((*pplist)->next == NULL){free(*pplist);*pplist = NULL;}else{SListNode* tail = *pplist;SListNode* prev = NULL;while (tail->next != NULL){prev = tail;tail = tail->next;}free(tail);prev->next = NULL;}
}

2:不找到尾节点,找尾节点的前一个节点

 这里同样是需要单独处理一种情况的喔!

void SListPopBack(SListNode** pplist)
{assert(*pplist);assert(pplist);//只有一个节点的情况if ((*pplist)->next == NULL){free(*pplist);*pplist = NULL;}else{//骑士不是找尾节点啦,找的是尾节点的前一个节点SListNode* tail = *pplist;while (tail->next->next != NULL){tail = tail->next;}//释放,置空free(tail->next);tail->next = NULL;}
}

3.6 void SListPopFront(SListNode** pplist) 的实现

头删肯定要改变 plist 的撒,所以要传 plist 的地址哦,同样需要断言,没有数据不允许删除数据。

头删就简单啦,找到 *pplist 的下一个节点,记录下来,然后释放 *pplist,将 *pplist 置为记录下来的那个值就行。

//单链表的头删
void SListPopFront(SListNode** pplist)
{assert(pplist);assert(*pplist);//记录*pplist的下一个节点SListNode* next = (*pplist)->next;//释放,改变原来的plistfree(*pplist);*pplist = next;
}

3.7 SListNode* SListFind(SListNode* plist, SLTDateType x) 的实现

这是在链表中查找值为 x 的第一个节点的,返回这个节点的指针。这个是配合 指定位置删除和插入的函数使用的。

这里不需要改变 plist,不用传 plist 的地址,查找方法就是遍历加判断。

//单链表的查找
SListNode* SListFind(SListNode* plist, SLTDateType x)
{assert(plist);//用cur遍历链表SListNode* cur = plist;while (cur != NULL){//查找到值为x的节点返回即可if (cur->data == x)return cur;cur = cur->next;}//找不到返回NULLreturn NULL;
}

3.8 void SListInsertAfter(SListNode* pos, SLTDateType x) 的实现

这个函数是在 pos 之后插入一个节点。为啥不在 pos 位置之前插入 x 呢,就是麻烦,pos位置之前插入的话,必须遍历找到pos位置之前的结构体,时间复杂度 O(N)。而在pos位置之后的插入,找到pos的下一个节点很轻松,直接插就行了。这也是单链表的缺点,无法向前找元素的哦!

这个 pos 的结构体指针就是通过 SListNode* SListFind(SListNode* plist, SLTDateType x)  的返回值来的哦!

//在pos位置之后插入 x
void SListInsertAfter(SListNode* pos, SLTDateType x)
{assert(pos);//申请节点SListNode* newNode = BuySListNode(x);//找到pos的下一个节点SListNode* next = pos->next;//连接节点pos->next = newNode;newNode->next = next;
}

3.9 void SListEraseAfter(SListNode* pos) 的实现

这个函数是删除 pos 位置之后的节点。同样不删除 pos 位置 或者 pos位置之前的节点,都是因为找到 pos 位置之前的节点很不容易。单链表没办法!!!

//单链表删除pos位置之后的节点
void SListEraseAfter(SListNode* pos)
{assert(pos);assert(pos->next);//记录pos之后的下一个节点SListNode* next = pos->next->next;free(pos->next);pos->next = next;
}

3.10 void SListDestroy(SListNode* plist) 的实现

这个函数简单咯,遍历单链表,一个一个的释放节点就行,注意:一定要在找到下一个节点之后才能释放哦!

//单链表的销毁
void SListDestroy(SListNode* plist)
{//用cur遍历链表SListNode* cur = plist;while (cur != NULL){//找到下一个节点SListNode* next = cur->next;free(cur);cur = next;}
}

4. 题目练习

4.1 链表中的倒数第 K 个节点

剑指 Offer 22. 链表中倒数第k个节点 - 力扣(LeetCode)

题目详解:

http://t.csdn.cn/NcVND

4.2 环形链表 Ι && 环形链表 Ⅱ

141. 环形链表 - 力扣(LeetCode)

142. 环形链表 II - 力扣(LeetCode)

题目详解:

http://t.csdn.cn/YNwfJ

4.3 反转链表

剑指 Offer 24. 反转链表 - 力扣(LeetCode)

题目详解:

http://t.csdn.cn/kkUvk

4.4 合并两个有序链表

21. 合并两个有序链表 - 力扣(LeetCode)

题目详解:

http://t.csdn.cn/J1LBu

相关文章:

C语言数据结构(3)----无头单向非循环链表

目录 1. 链表的概念及结构 2. 链表的分类 3. 无头单向非循环链表的实现(下面称为单链表) 3.1 SListNode* BuySListNode(SLTDateType x) 的实现 3.2 void SListPrint(SListNode* plist) 的实现 3.3 void SListPushBack(SListNode** pplist, SLTDateType x) 的实现 3.4 voi…...

Android 实现菜单拖拽排序

效果图简介本文主角是ItemTouchHelper。它是RecyclerView对于item交互处理的一个「辅助类」,主要用于拖拽以及滑动处理。以接口实现的方式,达到配置简单、逻辑解耦、职责分明的效果,并且支持所有的布局方式。功能拆解功能实现4.1、实现接口自…...

通过window.open打开新的页面并修改样式添加内容

const img new Image(); img.src res; //res是图片的路径地址 const newWin window.open(, _blank); newWin.document.write(img.outerHTML); // newWin.document.body.style.background #000; newWin.document.body.style.textAlign center; newWin.document.body.oncl…...

Java中 Synchronized 的用法

《编程思想之多线程与多进程(1)——以操作系统的角度述说线程与进程》一文详细讲述了线程、进程的关系及在操作系统中的表现,这是多线程学习必须了解的基础。本文将接着讲一下Java线程同步中的一个重要的概念synchronized. synchronized是Java中的关键字&#xff0c…...

Rust语言的基本介绍

rust缘起和目标 rust的英文是锈菌,是一种真菌,这种真菌的生命力非常顽强,其 在生命周期内可以产生多达5种孢子类型,这5种生命形态还可以相互转 化。“Rust”也有“铁锈”的意思,暗合“裸金属”之意,代表了R…...

新冠小阳人症状记录

原想挺过春节后再养,发现事与愿违。生理期期间抵抗力下降,所以在生理期第二天就有些症状了。可能是生理期前一天出去采购食物染上,也可能是合租夫妻染上。anyway,记录下自己的症状与相应有效的偏方: 第一天&#xff1a…...

SQL零基础入门学习(十四)

上篇:SQL零基础入门学习(十三) SQL NULL 值 NULL 值代表遗漏的未知数据。 默认地,表的列可以存放 NULL 值。 如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该…...

Excel工作表不能移动或复制?看看是不是这两个原因

Excel工作表不能移动或复制?今天来看看如何解决。 大家都知道,Excel表格分为工作簿和工作表,工作簿就是整个Excel文件;工作簿里面,也就是Excel表可以有多个工作表。 而各个工作表之间是可以相互移动或复制的&#xf…...

利用递归实现括号匹配

案例引入以下则是各个字符串经过括号处理之后的结果:12((21))(12-->12(21)1232((((2121)212(21)-->32(2121)212(21)ABDF((SA)SA)SA(SA)SA(((-->ABDF((SA)SA)SA(SA)SA算法思路:这个问题的解决方法就是将字符按顺序逐一加入到新的string容器store…...

14.线程数量怎么制定?

什么是CPU 密集型任务和耗时 IO 型任务 ? CPU 密集型任务 CPU 密集型任务,比如加密、解密、压缩、计算等一系列需要大量耗费 CPU 资源的任务。 耗时 IO 型任务 数据库、文件的读写,网络通信等任务,这种任务的特点是并不会特别消耗…...

C++中STL标准模板库学习记录

文章目录:1.vector1.1 遍历方式1.2 构造函数1.3 容量大小问题1.4 插入和删除1.5 存取值1.6 交换两个vectot的元素1.7 预定义存储空间2.string3. deque4. stack4.1 常用函数5. queue5.1 特点5.2 方法6. list6.1 优点6.2 缺点6.3 构造函数6.4 交换6.5 大小6.6 插入和删…...

《数据库系统概论》学习笔记——第六章 关系数据理论

教材为数据库系统概论第五版(王珊) 这一章重点在于各种范式的概念和将低级范式转为高级范式。一定要看多值依赖和4NF(因为这个概念很绕又烦,但是期中期末都考了)。最后计算题就是一定要会:算闭包&#xff0…...

Odoo | Webserivce | 5分钟学会【JSONRPC】接口开发

文章目录Odoo - JsonRPC1. Odoo内方法结构(接收端)2. POST接口请求结构(发送端)3. 实例测试Odoo - JsonRPC 1. Odoo内方法结构(接收端) # -*- coding: utf-8 -*- import odoo import logging import trac…...

搜广推 NeuralCF - 改进协同过滤+矩阵分解的思想

😄 NeuralCF:2017新加坡国立大学提出。【后文简称NCF】 😄 PNN:2016年上海交通大学提出。 文章目录 NeuralCF动机原理general NCFNCF终极版(GMF+MLP的结合)缺点优点ReferenceNeuralCF 动机 前面学了MF,可知MF在用户-物品评分矩阵的基础上做矩阵分解(用户矩阵Q和物品…...

dbever连接kerberos认证的hive

文章目录一、本地安装kerberos客户端二、本地kerberos客户端登录三、dbever连接hive一、本地安装kerberos客户端 下载地址:https://web.mit.edu/kerberos/dist/index.html 安装:下一步或者自定义安装即可 安装后会自动生成配置文件:C:\Pro…...

pom依赖产生的各种问题

文章目录问题一(org.apache.ibatis.session.Configuration)解决方法问题二(ERROR StatusLogger No log4j2)解决方法问题三(com.google.common.util.concurrent)解决方法问题四(start bean documentationPluginsBootstrapper)解决方法问题五(Unable to infer base url. )解决办法…...

RPC编程:RPC框架设计目标

一:前导知识 Http是超文本传输协议,跨平台性非常好。Http可以传输文本,更多的时候传输的是文本,我们也是可以传输二进制的,我们基于Http进行下载的时候,就是走的Http协议。 Tcp协议,处理的时候…...

RBAC 权限模型介绍

RBAC 权限: 一、关系: 这基于角色的访问控制的结构就叫RBAC结构。 二、RBAC 重要对象: 用户(Employee):角色施加的主体;用户通过拥有某个或多个角色以得到对应的权限。角色(Role&…...

西电面向对象程序设计核心考点汇总(期末真题)

文章目录前言一、往年真题与答案1.1 改错题1.2 读程题1.3 面向对象程序设计二、易错知识点2.1 构造函数2.2 静态成员变量和静态成员函数2.3 权限2.4 继承2.5 多态总结前言 主要针对西安电子科技大学《面向对象程序设计》的核心考点进行汇总,包含总共8章的核心简答。…...

判断一个用字符串表达的数字是否可以被整除

一.问题引出 当一个数字很大的时候,我们常用字符串进行表达,(超过了int和long等数据类型可以存储的最大范围),但是这个时候我们该如何判断他是否可以被另一个数整除呢? 这个时候我们不妨这样来考虑问题,每次将前边求模之后的数保存下来,然后乘以10和这一位的数字进行相加的操…...

这是一款值得开发人员认真研究的软件,数据库优化,应用服务器安全优化...

1.查询数据库死锁相关信息2.查看数据库的链接情况3.当前实例上的所有用户4.创建数据库独立密码5.查看数据库使用的端口号6.当前数据库设置的最大连接数7.当前数据库最大的理论可连接数8.当前数据库实例的连接数9.当前数据库连接数10.当前数据库连接超时设置11.当前sqlserver 超…...

栈与队列小结

一、理论基础1.队列是先进先出,栈是先进后出2.栈和队列是STL(C标准库)里面的两个数据结构。栈提供push和pop等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器。3.栈是以底层容器…...

SpringBoot整合(五)HikariCP、Druid数据库连接池—多数据源配置

在项目中,数据库连接池基本是必不可少的组件。在目前数据库连接池的选型中,主要是 Druid ,为监控而生的数据库连接池。HikariCP ,号称性能最好的数据库连接池。 在Spring Boot 2.X 版本,默认采用 HikariCP 连接池。而…...

ShardingSphere水平、垂直分库、分表和公共表

目录一、ShardingSphere简介二、ShardingSphere-分库分表1、垂直拆分(1)垂直分库(2)垂直分表2、水平拆分(1)水平分库(2)水平分表三、水平分库操作1、创建数据库和表2、配置分片的规则…...

《分布式技术原理与算法解析》学习笔记Day24

分布式缓存 在计算机领域,缓存是一个非常重要的、用来提升性能的技术。 什么是分布式缓存? 缓存技术是指用一个更快的存储设备存储一些经常用到的数据,供用户快速访问。 分布式缓存是指在分布式环境或者系统下,把一些热门数据…...

强化学习RL 02: Value-based Reinforcement Learning

DQN和TD更新算法。 目录 Review 1. Deep Q-Network(DQN) 1.1 Approximate the Q*(s,a) Function 1.2 Apply DQN to Play Game 1.3 Temporal Difference(TD) Learning 1.4 TD Learning for DQN 1.4.1 TD使用条件 condition 1.4.2 Train DQN using TD learning 1.5 summ…...

08_MySQL聚合函数

1. 聚合函数介绍什么是聚合函数聚合函数作用于一组数据,并对一组数据返回一个值。聚合函数类型AVG()SUM()MAX()MIN()COUNT()注意:聚合函数不能嵌套调用。比如不能出现类似“AVG(SUM(字段名称))”形式的调用。1.1 AVG和SUM函数可以对数值型数据使用AVG 和…...

「TCG 规范解读」词汇表

可信计算组织(Ttrusted Computing Group,TCG)是一个非盈利的工业标准组织,它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立,并采纳了由可信计算平台联盟(the Trusted Computing Platform Alli…...

第三阶段-03MyBatis 中使用XML映射文件详解

MyBatis 中使用XML映射文件 什么是XML映射 使用注解的映射SQL的问题: 长SQL需要折行,不方便维护动态SQL查询拼接复杂源代码中的SQL,不方便与DBA协作 MyBatis建议使用XML文件映射SQL才能最大化发挥MySQL的功能 统一管理SQL, 方…...

从0开始学python -41

Python3 命名空间和作用域 命名空间 先看看官方文档的一段话: A namespace is a mapping from names to objects.Most namespaces are currently implemented as Python dictionaries。 命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是…...

自己动手做网站教程/品牌策划案例

GAN Step By Step 心血来潮 GSBS,顾名思义,我希望我自己能够一步一步的学习GAN。GAN 又名 生成对抗网络,是最近几年很热门的一种无监督算法,他能生成出非常逼真的照片,图像甚至视频。GAN是一个图像的全新的领域&#…...

网站建设图标/指数函数图像及性质

看了一眼,上次更新距今2个月,看起来我好咕咕啊(感叹),可是感觉这两个月也没闲着捏(比赛,cf,期末等等,幸亏期末考延期了,我这被期末作业都整死了快&#xff09…...

政府网站英文版建设指导/正规app推广

1.3.1 SAP财务相关模块的体系 SAP财务相关的模块涵盖了财务的核算、管理和决策多个层面。如果将它们分别看作财务的初级、中级、高级,可以将相关模块显示为图1-12所示。 图1-12 其中,深色背景、白色字体的模块为常用的模块。从图1-12中可以…...

网站怎么做图片动态图片不显示了/企业品牌推广

注意 1.通过property var 声明的数据类型即使是string类型,仍然无法使用string的方法,为了使用可以直接将其定义为string类型 2.Timer是qml的定时器,restart()方法才会清零,stop不会 3.Tooltip不是所有控…...

男女在浴室里做羞羞事网站/专业推广图片

本文还是介绍一些基本内容, 关于插件使用, 可以查看完整配置 space-vim. 如果想要在 Vim 里拥有高效编辑的能力, 必然要掌握超过单个字符编辑的能力, 不然就可能出现像之前看到过的一个笑话 : 在你刚开始使用 Vim 的时候做过什么令你 “难忘” 的事情? 答: 使用 j 跳转到 5000…...

网站制作机构/网站建设网站设计

试卷编号:0363 座位号 2018—2019学年度第一学期期末考试 市场调查与预测 试题 2019年01月 “你的手机是什么品牌?”,该问题犯的错误是( )。 A.断定性提问 B.诱导式问题 C.逻辑错误 D.个人隐私( &#xf…...