数据结构第二章习题课
数据结构第二章课后答案

数据结构第二章课后答案数据结构第二章课后答案1. 线性表1.1 数组实现线性表Q1. 请说明线性表的定义,并结合数组实现线性表的特点进行解释。
线性表是由n(n≥0)个数据元素构成的有序序列,其中n表示线性表的长度。
数组实现线性表的特点是使用一组具有相同数据类型的连续存储空间存储线性表中的元素,通过下标访问和操作元素。
A1. 线性表的定义指出,线性表是由若干个数据元素组成的有序序列。
具体地,在数组实现线性表中,我们将元素存储在一组连续的内存空间中,通过下标访问和操作元素。
由于数组的存储空间具有连续性,这样的实现方式可以在O(1)的时间复杂度下进行元素的访问和修改操作。
1.2 链表实现线性表Q2. 请说明链表实现线性表的特点,并与数组实现进行比较。
链表实现线性表的特点是通过指针将线性表中的元素按照节点的形式连接起来,每个节点包含了存储的元素和指向下一个节点的指针。
与数组实现相比,链表的插入和删除操作更为高效,但是访问某个位置的元素需要从头开始遍历,时间复杂度较大。
A2. 链表实现线性表的特点是通过使用节点和指针将线性表中的元素连接起来。
每个节点中包含了一个存储的元素和指向下一个节点的指针。
链表的插入和删除操作的时间复杂度为O(1),因为只需要改变指针的指向即可。
但是,访问某个位置的元素需要从头开始遍历链表,所以时间复杂度为O(n)。
2. 栈和队列2.1 栈的定义和基本操作Q3. 请给出栈的定义和基本操作。
栈是一种特殊的线性表,它只能在表的一端进行插入和删除操作,该端称为栈顶。
栈的基本操作包括入栈(push)和出栈(pop),分别用于将元素压入栈和将栈顶元素弹出。
A3. 栈是一种特殊的线性表,它只能在表的一端进行插入和删除操作。
这个特定的一端称为栈顶,而另一端称为栈底。
栈的基本操作包括入栈(push)和出栈(pop)。
入栈操作将一个元素压入栈顶,出栈操作将栈顶元素弹出。
2.2 队列的定义和基本操作Q4. 请给出队列的定义和基本操作。
数据结构第2章习题参考答案

数据结构第2章习题参考答案1. 简答题1.1 什么是数据结构?数据结构是指相互之间存在一种或多种特定关系的数据元素的集合,它包括数据的逻辑结构和物理结构。
1.2 数据结构的分类有哪些?数据结构可以分为线性结构和非线性结构。
线性结构包括线性表、栈、队列和串;非线性结构包括树和图。
1.3 数据结构的逻辑结构有哪些?数据结构的逻辑结构包括线性结构、树形结构和图形结构。
1.4 数据结构的物理结构有哪些?数据结构的物理结构包括顺序存储结构和链式存储结构。
1.5 什么是算法?算法是指求解问题的具体步骤和方法。
1.6 算法的特性有哪些?算法应具有有穷性、确定性、可行性和输入输出性。
2. 选择题2.1 在栈的顺序存储结构中,栈的存储位置是:A. 自顶向下递增B. 自底向上递增C. 自底向上递减D. 自顶向下递减答案:D2.2 下列哪个数据结构不适合表示有父子关系的数据?A. 二叉树B. 图C. 链表D. 堆答案:D2.3 对于一棵完全二叉树,叶子节点的个数为n,则树中节点的总数为:A. 2nB. 2n + 1C. nD. n + 1答案:A2.4 假设有一个长度为10的栈,初始时栈为空,若对该栈连续执行5次入栈操作,然后执行4次出栈操作,最后执行1次入栈操作,则栈中剩余的元素个数为:A. 0B. 1C. 4D. 6答案:D3. 编程题3.1 实现一个栈数据结构的基本操作,包括入栈、出栈、获取栈顶元素和判断栈是否为空。
```Pythonclass Stack:def __init__(self):self.items = []def is_empty(self):return len(self.items) == 0def push(self, item):self.items.append(item)def pop(self):if self.is_empty():return Nonereturn self.items.pop()def peek(self):if self.is_empty():return Nonereturn self.items[-1]```3.2 实现一个队列数据结构的基本操作,包括入队、出队、获取队首元素和判断队列是否为空。
数据结构课后习题第2章

2. 指针 P 指向不带头结点的线性链表 L 的首元素的条件是( )。
A.P= =L
C.P-﹥next==L
B.L-﹥Next==P
D.P-﹥next==NULL
3. 指针 p 指向带头结点的单循环链表 L 的首元素的条件是( )。
A.P= =L
C.P-﹥next==L
B.L-﹥Next==P
D.P-﹥next==NULL
网络工程 2011 级 1 班、计算机科学与技术 2011 级 2 班《算法与数据结构》课后习题(第 2 章)
2011 级 计科 (网工)
题号
得分
一
【课后习题】第 2 章 线性表
班 学号:
一、判断题(如果正确,在题号前打“”,否则打“”。每题 2 分,共 10 分)
二
( ) 1. 线性表若采用顺序存储表示时所有结点之间的存储单元地址必须连续。 ( ) 2. 顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。 ( ) 3. 如果某个数据结构的每一个元素都是最多只有一个直接前驱,则必为线性结构。 ( ) 4. 线性表的逻辑顺序与物理顺序总是一致的。 ( ) 5. 线性表的长度是指它所占存储空间的大小。
二、填空题(每空 1.5 分,共 21 分)
1. 从逻辑结构看,线性表是典型的
2. 在一个长度为 n 的向量中在第 i(1≤i≤n+1)个元素之前插入一个元素时,需向后移动
个元素,算法的时间复杂度为
3. 在一个长度为 n 的向量中删除第 i(1≤i≤n)个元素时,需向前移动
算法的时间复杂度为
。
。
4. 若长度为 n 的线性表采用链式存储结构,在其第 i 个结点前插入一个新的元素的算法的
数据结构课后习题第二章

一、选择题1. 线性表是具有n个()的有限序列。
A.数据项 B. 数据元素 C. 数据对象 D.表记录2. 以下关于线性表的说法不正确的是()。
A. 线性表中的数据元素可以是数字、字符、记录等不同类型B. 线性表中包含的数据元素个数不是任意的C. 线性表中的每个结点都有且只有一个直接前趋和直接后继D. 存在这样的线性表:表中各结点都没有直接前趋和直接后继3. 线性表的顺序存储结构是一种()的存储结构。
A. 随机存取B. 顺序存取C. 索引存取D. 散列存取4. 在顺序表中,只要知道(),就可在相同时间内求出任一结点的存储地址。
A.基地址 B. 结点大小 C. 线性表大小 D. 基地址和结点大小5. 下面关于线性表的叙述中,错误的是()。
A. 线性表采用顺序存储,必须占用一片连续的存储单元B. 线性表采用顺序存储,便于进行插入和删除操作C. 线性表采用链式存储,不必占用一片连续的存储单元D. 线性表采用链式存储,便于插入和删除操作6. 线性表采用链表存储时其存储地址要求()。
A. 必须是连续的B. 部分地址必须是连续的C. 必须是不连续的D. 连续和不连续都可以7. 一个长度为n的线性表顺序存储,向第i个元素(1<=i<=n+1)之前插入一个新元素时,需要从后向前依次后移()个元素。
A.n-i B. n-i+1 C. n-i-1 D. i8.()运算,使用顺序表比链式表好。
A. 插入B. 删除C. 根据序号查找D. 根据元素值查找9.向具有n个结点的有序单链表中插入一个新的结点并仍然有序的时间复杂度是()。
A.O(1)B.O(n)C.O(n2)D.O(㏒2n)10.在一个长度为n的顺序存储的线性表中,删除第i个元素(1<=i<=n)时,需要从前向后依次前移()个元素。
A.n-i B.n-i+1 C.n-i-1 D.i11.在一个长度为n的线性表中顺序查找值为x的元素时,平均查找长度(即x 同元素的平均比较次数,假定查找每个元素的概率都相等)为()。
数据结构第2章习题参考答案

数据结构第2章习题参考答案2.7习题2.7.1知识点:线性表的逻辑结构一、选择题1①线性表l=(a1,a2,…,an),下列说法正确的是(d)。
a.每个元素都有一个直接前驱和一个直接后继。
b.线性表中至少要有一个元素。
c.表诸元素的排序顺序必须就是由小到大或由小至大。
d.除第一个和最后一个元素外,其余每个元素都有一个且仅有一个直接前驱和直接后继。
2①在线性表的下列运算中,不改变数据元素之间结构关系的运算是(d)。
a.插入b.删除c.排序d.定位3①线性表就是具备n个(c)的非常有限序列(n>0)。
【清华大学1998】a.表元素b.字符c.数据元素d.数据项e.信息项二、判断题(t)1①线性表中的每个结点最多只有一个前驱和一个后继。
(f)2①线性表中的每个结点都至少存有一个前驱结点和后继结点。
(f)3①线性表就是n个数的非常有限序列。
(f)4①同一线性表的数据元素可以具有不同的特性。
(t)5①线性表的长度n就是表数据元素的个数,当n=0时,称作空表。
(t)6①线性表就是一个相当有效率的数据结构,它的长度可以根据须要快速增长或延长。
(f)7①对线性表中的数据元素就可以展开出访,无法展开填入和删掉操作方式。
2.7.2知识点:线性表的顺序存储结构一、选择题1①在一个长度为n的顺序表中,在第i个元素(1<=i<=n+1)之前插入一个新元素时需向后移动(b)个元素.a.n-1b.n-i+1c.n-i-1d.i2①若某线性表中最常用的操作方式就是挑第i个元素和打听第i个元素的前趋元素,则使用(d)存储方式最节省时间。
a.单链表b.双链表c.单向循环d.顺序表3②一个数组第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是(b)a.110b.108c.100d.1204①下列哪一条就是顺序存储结构的优点(a)。
【北方交通大学2001】a.存储密度小b.填入运算便利c.删除运算方便d.可方便地用于各种逻辑结构的存储表示5③若长度为n的线性表使用顺序存储结构,在其第i个边线填入一个新元素的算法的时间复杂度为(c)(1<=i<=n+1)。
数据结构第二章课后答案

数据结构第二章课后答案数据结构第二章课后答案==========================================2.1 题目1:什么是线性表?线性表的特点有哪些?答案:线性表是由n个数据元素组成的有限序列,其中n为表的长度,线性表具有以下特点:1.除第一个元素外,每个元素均有一个直接前驱元素;2.除最后一个元素外,每个元素均有一个直接后继元素;3.线性表具有唯一的一个始元素和终元素。
2.2 题目2:什么是顺序存储结构?顺序存储结构有什么特点?答案:顺序存储结构是指用一组地质连续的存储单元依次存储线性表的数据元素,顺序存储结构具有以下特点:1.线性表的元素在计算机中是连续存储的,可以通过下标直接访问元素;2.插入和删除操作需要移动大量元素,效率较低;3.存储空间需要预先分配大小,固定不变。
2.3 题目3:什么是链式存储结构?链式存储结构有什么特点?答案:链式存储结构是指线性表的元素在计算机内存中非连续存储,而是通过每个元素中的指针起来的结构,链式存储结构具有以下特点:1.线性表的元素在内存中可以是非连续存储,节省存储空间;2.插入和删除操作只需要修改指针,效率较高;3.需要额外的指针域存储信息,增加了存储空间开销。
2.8 题目8:请解释迷宫问题的基本思路。
答案:迷宫问题的基本思路是使用回溯算法,即从某个位置开始进行深度优先搜索,逐步尝试各种可能的路径,直到找到一条通路或者遍历完所有可能的路径。
基本步骤如下:1.选择一个起始位置,并将其标记为已访问;2.检查当前位置的四周是否有未访问的相邻位置;3.如果有未访问的相邻位置,选择其中一个位置继续深度搜索;4.如果所有相邻位置都被访问过或者当前位置是死胡同,回溯到上一个位置;5.重复步骤2-4,直到找到通路或者遍历完所有路径。
附件:无法律名词及注释:1.版权:指对文字、图像、音乐等作品享有法律保护的权利,未经作者许可不得使用;2.知识产权:指人们创造的智力成果所享有的权益,包括专利权、商标权、著作权等;3.公平使用:指在特定情况下,可以在不获得版权所有人许可的情况下使用作品的一定范围。
数据结构 课后习题 第2章

一、名词解释1.线性表2.顺序表3.单链表4.循环单链表5.循环双向链表二、选择题1.用单链表方式存储的线性表,存储每个结点需要两个域,一个是数据域,另一个是_________A.当前结点的所在地址B.后继结点的所在地址C.空指针域D.空闲域2.不带头结点的单链表head为空的判定条件是__________A.head==NULLB.head→next==NULLC.head→next==headD.head!=NULL3.带头结点的单链表head为空的判定条件是__________A.head==NULLB.head→next==NULLC.head→next==headD.head!=NULL4.一个顺序表的第一个元素的存储地址是100,每个元素的长度为5,则第7个元素的地址是____________A. 130B. 125C. 120D. 1355.非空的循环单链表head的尾结点(由p所指向)满足____________A.p→next==NULLB.p==NULLC.p→next==headD.p==head6.设线性链表中结点的结构为(data, next),已知指针q所指结点是指针结点p的直接前驱,若在q与p之间插入结点s,则应执行_________操作A.s→next=p→next; p→next=s;B.q→next=s; s→next=p;C.p→next=s→next; s→next=p;D.p→next=s; s→next=q;7.设线性链表中结点的结构为(data, next),已知指针p所指结点不是尾结点,若在p之后插入结点s,则应执行_____操作A.s→next=p; p→next=s;B.s→next=p→next; p→next=s;C.s→next=p→next; p=s;D.p→next=s; s→next=p;8.设线性链表中结点的结构为(data, next),若想删除结点p的直接后继,则应执行______A.p→next=p→next→next;B.p=p→next; p→next= p→next→nextC.p→next=p→next;D.p=p→next→next;9.p指向线性链表中L的某一个结点,则在线性链表的表尾插入结点s的语句序列是_________A.while(p→next != NULL) p=p→next; p→next=s; s→next=NULL;B.while(p != NULL) p=p—next; p→next=s; s→next=NULL;C.while(p→next != NULL) p=p→next; s→next=p; p→next=NULL;D.while(p!=NULL) p=p→next→next; p→next=s; s→next=p→next;三、填空题1.按顺序存储方法存储的线性表称为________,按链式存储方法存储的线性表称为________。
数据结构课后习题与解析第二章

第二章习题1. 描述以下三个概念的区别:头指针,头结点,首元素结点。
2. 填空:(1)在顺序表中插入或删除一个元素,需要平均移动元素,具体移动的元素个数与有关。
(2)在顺序表中,逻辑上相邻的元素,其物理位置相邻。
在单链表中,逻辑上相邻的元素,其物理位置相邻。
(3)在带头结点的非空单链表中,头结点的存储位置由指示,首元素结点的存储位置由指示,除首元素结点外,其它任一元素结点的存储位置由指示。
3.已知L是无表头结点的单链表,且P结点既不是首元素结点,也不是尾元素结点。
按要求从下列语句中选择合适的语句序列。
a. 在P结点后插入S结点的语句序列是:。
b. 在P结点前插入S结点的语句序列是:。
c. 在表首插入S结点的语句序列是:。
d. 在表尾插入S结点的语句序列是:。
供选择的语句有:(1)P->next=S;(2)P->next= P->next->next;(3)P->next= S->next;(4)S->next= P->next;(5)S->next= L;(6)S->next= NULL;(7)Q= P;(8)while(P->next!=Q) P=P->next;(9)while(P->next!=NULL) P=P->next;(10)P= Q;(11)P= L;(12)L= S;(13)L= P;4. 设线性表存于a(1:arrsize)的前elenum个分量中且递增有序。
试写一算法,将X插入到线性表的适当位置上,以保持线性表的有序性。
5. 写一算法,从顺序表中删除自第i个元素开始的k个元素。
6. 已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。
试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析你的算法的时间复杂度(注意:mink和maxk是给定的两个参变量,它们的值为任意的整数)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、试描述头指针、头结点、开始结点的区别、并说明头指针和头结点的作用。
答:开始结点是指链表中的第一个结点,也就是没有直接前趋的那个结点。
链表的头指针是一指向链表开始结点的指针(没有头结点时),单链表由头指针唯一确定,因此单链表可以用头指针的名字来命名。
头结点是我们人为地在链表的开始结点之前附加的一个结点。
有了头结点之后,头指针指向头结点,不论链表否为空,头指针总是非空。
而且头指针的设置使得对链表的第一个位置上的操作与在表其他位置上的操作一致(都是在某一结点之后)。
2、何时选用顺序表、何时选用链表作为线性表的存储结构为宜?答:在实际应用中,应根据具体问题的要求和性质来选择顺序表或链表作为线性表的存储结构,通常有以下几方面的考虑:1) 基于空间的考虑。
当要求存储的线性表长度变化不大,易于事先确定其大小时,为了节约存储空间,宜采用顺序表;反之,当线性表长度变化大,难以估计其存储规模时,采用动态链表作为存储结构为好。
2) 基于时间的考虑。
若线性表的操作主要是进行查找,很少做插入和删除操作时,采用顺序表做存储结构为宜;反之,若需要对线性表进行频繁地插入或删除等操作时,宜采用链表做存储结构。
并且,若链表的插入和删除主要发生在表的首尾两端,则采用尾指针表示的单循环链表为宜。
3、在顺序表中插入和删除一个结点需平均移动多少个结点?具体的移动次数取决于哪两个因素?答:在等概率情况下,顺序表中插入一个结点需平均移动n/2个结点,删除一个结点需平均移动(n-1)/2个结点。
具体的移动次数取决于顺序表的长度n以及需插入或删除的位置i。
i 越接近n则所需移动的结点数越少。
4、为什么在单循环链表中设置尾指针比设置头指针更好?答:尾指针是指向终端结点的指针,用它来表示单循环链表可以使得查找链表的开始结点和终端结点都很方便,设一带头结点的单循环链表,其尾指针为rear,则开始结点和终端结点的位置分别是rear->next->next 和rear, 查找时间都是O(1)。
若用头指针来表示该链表,则查找终端结点的时间为O(n)。
5、在单链表、双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?若可以,其时间复杂度各为多少?答:我们分别讨论三种链表的情况。
1) 单链表。
当我们知道指针p指向某结点时,能够根据该指针找到其直接后继,但是由于不知道其头指针,所以无法访问到p指针指向的结点的直接前趋。
因此无法删去该结点。
2) 双链表。
由于这样的链表提供双向链接,因此根据已知结点可以查找到其直接前趋和直接后继,从而可以删除该结点。
其时间复杂度为O(1)。
3) 单循环链表。
根据已知结点位置,我们可以直接得到其后相邻的结点位置(直接后继),又因为是循环链表,所以我们可以通过查找,得到p结点的直接前趋。
因此可以删去p所指结点。
其时间复杂度应为O(n)。
6、下述算法的功能是什么?LinkList Demo(LinkList L){ // L是无头结点单链表ListNode *Q,*P;if(L&&L->next){Q=L;L=L->next;P=L;while (P->next) P=P->next;P->next=Q; Q->next=NULL;}return L;}// Demo答:该算法的功能是:将开始结点摘下链接到终端结点之后成为新的终端结点,而原来的第二个结点成为新的开始结点,返回新链表的头指针。
7、不带头结点的单链表head为空的判定条件是()。
A、head=NULLB、head->next=NULLC、head->next=headD、head!=NULL8、在一单链表中,已知q所指的结点是p所指结点的前驱结点,若在q和p之间插入s结点,则执行()。
A、s->next=p->next;p->next=s;B、p->next=s->next;s->next=p;C、q->next=s;s->next=p;D、p->next=s;s->next=q;9、在一个单链表中,若p所指的结点不是最后结点,在p之后插入s结点,则执行()。
A、s->next=p;p->next=s;B、s->next=p->next;p->next=s;C、s->next=p->next;p=s;D、p->next=s;s->next=p;10、在一个单链表中,若删除p所指结点的后续结点,则执行()。
A、p->next=p->next->next;B、p=p->next;p->next=p->next->next;C、p->next=p->next;D、p=p->next->next;11、从一个具有n个结点的单链表中查找其值等于x结点时,在查找成功的情况下,需要平均比较()个结点?A、nB、n/2C、(n-1)/2D、(n+1)/212、在一个具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是()。
A、O(1)B、O(n)C、O(n2)D、O(nlog2n)13、给定有n个元素的向量,建立一个有序单链表的时间复杂度是()。
A、O(1)B、O(n)C、O(n2)D、O(nlog2n)14、带有一个头结点的单链表head为空的条件是.15、对于一个具有n个结点的单链表,在已知p所指结点之后插入一个新结点的时间复杂度为;在给定值为x的结点后插入一个新结点的时间复杂度是。
16、设顺序表L是一个非递减有序表,试写一算法,将x插入L中,并使L仍是一个有序表。
解:因已知顺序表L是递增有序表,所以只要从头找起找到第一个比它大(或相等)的结点数据,把x插入到这个结点所在的位置就是了。
算法如下:void InsertIncreaseList(Sqlist *L,Datatype x){ int i;for( i=0;i<L->length && L->data[i]<x;i++);//查找并比较,分号不能少ListInsert (*L,i,x); // 调用顺序表插入函数}// InsertIncreaseList17、设顺序表L是一个递减有序表,试写一算法,将x插入其后仍保持L的有序性。
解:与上题相类似,只要从头找到第一个比x小(或相等)的结点数据,在这个位置插入就可以了。
算法如下:void InsertDecreaseList(Sqlist *L,Datatype x){ int i;for (i=0;i<L->length && L->data[i]>x;i++); //查找ListInsert(*L,i,x); // 调用顺序表插入函数}// InsertDecreaseList18、写一算法在单链表上实现线性表的ListLength(L)运算。
解:求单链表长只能用遍历的方法了,从头数到尾。
算法如下:int ListLength( LinkList L ){ int len=0; ListNode *p;p=L; //设该表有头结点while (p->next){ p=p->next;len++;}return len;}// ListLength19、已知L1和L2分别指向两个单链表的头结点,且已知其长度分别为m和n。
试写一算法将这两个链表连接在一起,请分析你的算法的时间复杂度。
解:算法如下:LinkList Link( LinkList L1 , LinkList L2 ){//将两个单链表连接在一起ListNode *p, *q;p=L1; q=L2;while ( p->next ) p=p->next; //查找终端结点p->next = q->next ; //将L2的开始结点链接在L1之后return L1 ;}// LinkList Link分析:本算法的主要操作时间花费在查找L1的终端结点上,与L2的长度无关,所以本算的法时间复杂度为:m+1=O(m)20、删除带头结点单链表L中的元素x。
解:算法如下:Void delete(LinkList &L,ElemType x){ p=L->next; pre=L;while(p){ if(p->data=x) { pre->next=p->next; free(p); p=pre->next; }else { pre=p; p=p->next; }}}//delete21、已知:A=(a1,a2,……,a n-1,a n) B=(b1,b2,……,b n-1,b n)均为顺序表,试编写一个比较A、B 大小的算法。
解:算法目标是分析两表的大小,所以不应破坏原表。
表的大小指的是“词典顺序”,而非表的长度。
基本操作为:同步比较两个表中相应的数据元素。
假设:int compare(SqList La,SqList Lb)循环条件:(i<=La.Length)&&( i<=Lb.Length)主要操作为:if (La.elem[i]==Lb.elem[i]) i++;else if (La.elem[i]<Lb.elem[i]) return -1;else return 1;循环结束时可能有三种情况:●(i> La.Length)&&( i>Lb.Length) return 0;●(i<=La.Length)&&(i>Lb.Length) return 1;●(i>La.Length)&&(i<=Lb.Length) return -1;22、删除有序表中所有其值大于minval且小于maxval的数据元素。
解:while(p&&p->data<=minval) { pre=p; p=p->next; }if (p){ while (p&&p->data<maxval) p=p->next;q=pre->next; pre->next=p;while(q!=p) //q==p时,删除的为一个元素{ s=q; q=q->next; free(s); } //释放中间结点23、写一算法将单链表中值重复的结点删除,使所得结果表中各结点值均不相同。