数据结构第三章习题

合集下载

数据结构第三章栈和队列3习题

数据结构第三章栈和队列3习题

第三章栈和队列试题一、单项选择题1.栈的插入和删除操作在()进行。

A. 栈顶B. 栈底C. 任意位置D. 指定位置2.当利用大小为n的数组顺序存储一个栈时,假定用top==n表示栈空,则向这个栈插入一个元素时,首先应执行()语句修改top指针。

A. top++;B. top--;C. top = 0;D. top;3.若让元素1,2,3依次进栈,则出栈次序不可能出现()种情况。

A. 3, 2, 1B. 2, 1, 3C. 3, 1, 2D. 1, 3, 24.在一个顺序存储的循环队列中,队头指针指向队头元素的()位置。

A. 前一个B. 后一个C. 当前D. 后面5.当利用大小为n的数组顺序存储一个队列时,该队列的最大长度为()。

A. n-2B. n-1C. nD. n+16.从一个顺序存储的循环队列中删除一个元素时,需要()。

A. 队头指针加一B. 队头指针减一C. 取出队头指针所指的元素D. 取出队尾指针所指的元素7.假定一个顺序存储的循环队列的队头和队尾指针分别为front和rear,则判断队空的条件为()。

A. front+1 == rearB. rear+1 == frontC. front == 0D. front == rear8.假定一个链式队列的队头和队尾指针分别为front和rear,则判断队空的条件为()。

A. front == rearB. front != NULLC. rear != NULLD. front == NULL9.设链式栈中结点的结构为(data, link),且top是指向栈顶的指针。

若想在链式栈的栈顶插入一个由指针s所指的结点,则应执行操作()。

A. top->link = s;B.s->link = top->link; top->link = s;C. s->link = top; top = s;D. s->link = top; top = top->link;10.设链式栈中结点的结构为(data, link),且top是指向栈顶的指针。

数据结构 习题 第三章 栈和队列 答案

数据结构 习题 第三章 栈和队列 答案

第三章栈和队列部分答案解释如下。

1、尾递归的消除就不需用栈2、这个数是前序序列为1,2,3,…,n,所能得到的不相似的二叉树的数目。

三、填空题1、操作受限(或限定仅在表尾进行插入和删除操作)后进先出2、栈3、3 1 24、23 100CH5、0 n+1 top[1]+1=top[2]6、两栈顶指针值相减的绝对值为1(或两栈顶指针相邻)。

7、(1)满 (2)空 (3)n (4)栈底 (5)两栈顶指针相邻(即值之差的绝对值为1)8、链式存储结构 9、S×SS×S×× 10、data[++top]=x;11、23.12.3*2-4/34.5*7/++108.9/+(注:表达式中的点(.)表示将数隔开,如23.12.3是三个数)12、假溢出时大量移动数据元素。

13、(M+1) MOD N (M+1)% N; 14、队列 15、先进先出 16、先进先出 17、s=(LinkedList)malloc(sizeof(LNode)); s->data=x;s->next=r->next;r->next=s;r=s;18、牺牲一个存储单元设标记19、(TAIL+1)MOD M=FRONT (数组下标0到M-1,若一定使用1到M,则取模为0者,值改取M20、sq.front=(sq.front+1)%(M+1);return(sq.data(sq.front));(sq.rear+1)%(M+1)==sq.front;21、栈 22、(rear-front+m)% m; 23、(R-P+N)% N;24、(1)a[i]或a[1] (2)a[i] (3)pop(s)或s[1];25、(1)PUSH(OPTR,w)(2)POP(OPTR)(3)PUSH(OPND,operate(a,theta,b))26、(1)T>0(2)i<n(3)T>0(4)top<n(5)top+1(6)true(7)i-1(8)top-1(9)T+w[i](10)false四、应用题1、栈是只准在一端进行插入和删除操作的线性表,允许插入和删除的一端叫栈顶,另一端叫栈底。

数据结构第三章习题

数据结构第三章习题

第三章习题1.按图3.1(b)所示铁道(两侧铁道均为单向行驶道)进行车厢调度,回答:⑴如进站的车厢序列为123,则可能得到的出站车厢序列是什么?⑵如进站的车厢序列为123456,能否得到435612和135426的出站序列,并说明原因。

(即写出以“S”表示进栈、以“X”表示出栈的栈操作序列)。

2.设队列中有A、B、C、D、E这5个元素,其中队首元素为A。

如果对这个队列重复执行下列4步操作:(1)输出队首元素;(2)把队首元素值插入到队尾;(3)删除队首元素;(4)再次删除队首元素。

直到队列成为空队列为止,得到输出序列:(1)A、C、E、C、C (2) A、C、E(3) A、C、E、C、C、C (4) A、C、E、C3.给出栈的两种存储结构形式名称,在这两种栈的存储结构中如何判别栈空与栈满?4.按照四则运算加、减、乘、除和幂运算(↑)优先关系的惯例,画出对下列算术表达式求值时操作数栈和运算符栈的变化过程:A-B*C/D+E↑F5.试写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如‘序列1&序列2’模式的字符序列。

其中序列1和序列2中都不含字符’&’,且序列2是序列1的逆序列。

例如,‘a+b&b+a’是属该模式的字符序列,而‘1+3&3-1’则不是。

6.假设表达式由单字母变量和双目四则运算算符构成。

试写一个算法,将一个通常书写形式且书写正确的表达式转换为逆波兰式。

7.假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应的队列初始化、入队列和出队列的算法。

8.要求循环队列不损失一个空间全部都能得到利用, 设置一个标志域tag , 以tag为0或1来区分头尾指针相同时的队列状态的空与满,请编写与此结构相应的入队与出队算法。

9.简述以下算法的功能(其中栈和队列的元素类型均为int):(1)void proc_1(Stack S){ int i, n, A[255];n=0;while(!EmptyStack(S)){n++; Pop(&S, &A[n]);} for(i=1; i<=n; i++)Push(&S, A[i]);}(2)void proc_2(Stack S, int e) { Stack T; int d;InitStack(&T);while(!EmptyStack(S)){ Pop(&S, &d);if (d!=e) Push( &T, d);}while(!EmptyStack(T)){ Pop(&T, &d);Push( &S, d);}}(3)void proc_3(Queue *Q){ Stack S; int d;InitStack(&S);while(!EmptyQueue(*Q)){DeleteQueue(Q, &d);Push( &S, d);}while(!EmptyStack(S)){ Pop(&S, &d);EnterQueue(Q,d)}}实习题1.回文判断。

数据结构练习题第三章栈、队列和数组习题及答案

数据结构练习题第三章栈、队列和数组习题及答案

第三章栈、队列和数组一、名词解释:1.栈、栈顶、栈底、栈顶元素、空栈2.顺序栈3.链栈4.递归5.队列、队尾、队头6.顺序队7.循环队8.队满9.链队10.随机存储结构11.特殊矩阵12.稀疏矩阵13.对称方阵14.上(下)三角矩阵二、填空题:1.栈修改的原则是_________或称________,因此,栈又称为________线性表。

在栈顶进行插入运算,被称为________或________,在栈顶进行删除运算,被称为________或________。

2.栈的基本运算至少应包括________、________、________、________、________五种。

3.对于顺序栈,若栈顶下标值top=0,此时,如果作退栈运算,则产生“________”。

4.对于顺序栈而言,在栈满状态下,如果此时在作进栈运算,则会发生“________”。

5.一般地,栈和线性表类似有两种实现方法,即________实现和________实现。

6.top=0表示________,此时作退栈运算,则产生“________”;top=sqstack_maxsize-1表示________,此时作进栈运算,则产生“________”。

7.以下运算实现在顺序栈上的初始化,请在________处用适当的句子予以填充。

int InitStack(SqStackTp *sq){ ________;return(1);}8.以下运算实现在顺序栈上的进栈,请在________处用适当的语句予以填充。

Int Push(SqStackTp *sq,DataType x){ if(sp->top==sqstack_maxsize-1}{error(“栈满”);return(0);}else{________________:________________=x;return(1);}}9.以下运算实现在顺序栈上的退栈,请在________________用适当句子予以填充。

数据结构(第二版)习题答案第3章

数据结构(第二版)习题答案第3章

3.1 选择题第3章线性表的链式存储(1)两个有序线性表分别具有n个元素与m个元素且n≤m,现将其归并成一个有序表,其最少的比较次数是( A )。

A.n B.m C.n− 1D.m + n(2)非空的循环单链表head 的尾结点(由p 所指向)满足( C )。

A.p->next==NULL B.p==NULL C.p->next==head D.p==head (3)在带头结点的单链表中查找x应选择的程序体是( C )。

A.node *p=head->next; while (p && p->info!=x) p=p->next;if (p->info==x) return p else return NULL;B.node *p=head; while (p&& p->info!=x) p=p->next; return p;C.node *p=head->next; while (p&&p->info!=x) p=p->next; return p;D.node *p=head; while (p->info!=x) p=p->next ; return p;(4)线性表若采用链式存储结构时,要求内存中可用存储单元的地址( D )。

A.必须是连续的C.一定是不连续的B.部分地址必须是连续的D.连续不连续都可以(5)在一个具有n个结点的有序单链表中插入一个新结点并保持单链表仍然有序的时间复杂度是( B )。

A.O(1) B.O(n) C.O(n2) D.O(n log2n)(6)用不带头结点的单链表存储队列时,其队头指针指向队头结点,其队尾指针指向队尾结点,则在进行删除操作时( D )。

A.仅修改队头指针C.队头、队尾指针都要修改B.仅修改队尾指针D.队头,队尾指针都可能要修改(7)若从键盘输入n个元素,则建立一个有序单向链表的时间复杂度为( B )。

数据结构练习题 第三章 栈、队列和数组 习题及答案

数据结构练习题 第三章 栈、队列和数组 习题及答案

第三章栈、队列和数组一、名词解释:1.栈、栈顶、栈底、栈顶元素、空栈2.顺序栈3.链栈4.递归5.队列、队尾、队头6.顺序队7.循环队8.队满9.链队10.随机存储结构11.特殊矩阵12.稀疏矩阵13.对称方阵14.上(下)三角矩阵二、填空题:1.栈修改的原则是_________或称________,因此,栈又称为________线性表。

在栈顶进行插入运算,被称为________或________,在栈顶进行删除运算,被称为________或________。

2.栈的基本运算至少应包括________、________、________、________、________五种。

3.对于顺序栈,若栈顶下标值top=0,此时,如果作退栈运算,则产生“________”。

4.对于顺序栈而言,在栈满状态下,如果此时在作进栈运算,则会发生“________”。

5.一般地,栈和线性表类似有两种实现方法,即________实现和________实现。

6.top=0表示________,此时作退栈运算,则产生“________”;top=sqstack_maxsize-1表示________,此时作进栈运算,则产生“________”。

7.以下运算实现在顺序栈上的初始化,请在________处用适当的句子予以填充。

int InitStack(SqStackTp *sq){ ________;return(1);}8.以下运算实现在顺序栈上的进栈,请在________处用适当的语句予以填充。

Int Push(SqStackTp *sq,DataType x){ if(sp->top==sqstack_maxsize-1}{error(“栈满”);return(0);}else{________________:________________=x;return(1);}}9.以下运算实现在顺序栈上的退栈,请在________________用适当句子予以填充。

《数据结构》习题集:第3章 栈和队列

《数据结构》习题集:第3章 栈和队列

第3章栈和队列一、选择题1.栈结构通常采用的两种存储结构是(A )。

A、顺序存储结构和链表存储结构B、散列和索引方式C、链表存储结构和数组D、线性链表结构和非线性存储结构2.设栈ST 用顺序存储结构表示,则栈ST 为空的条件是( B )A、ST.top-ST.base<>0B、ST.top-ST.base==0C、ST.top-ST.base<>nD、ST.top-ST.base==n3.向一个栈顶指针为HS 的链栈中插入一个s 结点时,则执行( C )A、HS->next=s;B、s->next=HS->next;HS->next=s;C、s->next=HS;HS=s;D、s->next=HS;HS=HS->next;4.从一个栈顶指针为HS 的链栈中删除一个结点,用x 保存被删除结点的值,则执行( C)A 、x=HS;HS=HS->next;B 、HS=HS->next;x=HS->data;C 、x=HS->data;HS=HS->next;D 、s->next=Hs;Hs=HS->next;5.表达式a*(b+c)-d 的后缀表达式为( B )A、abcdd+-B、abc+*d-C、abc*+d-D、-+*abcd6.中缀表达式A-(B+C/D)*E 的后缀形式是( D )A、AB-C+D/E*B、ABC+D/E*C、ABCD/E*+-D、ABCD/+E*-7.一个队列的入列序列是1,2,3,4,则队列的输出序列是( B )A、4,3,2,1B、1,2,3,4C、1,4,3,2D、3,2,4,18.循环队列SQ 采用数组空间SQ.base[0,n-1]存放其元素值,已知其头尾指针分别是front 和rear,则判定此循环队列为空的条件是()A、Q.rear-Q.front==nB、Q.rear-Q.front-1==nC、Q.front==Q.rearD、Q.front==Q.rear+19.循环队列SQ 采用数组空间SQ.base[0,n-1]存放其元素值,已知其头尾指针分别是front 和rear,则判定此循环队列为满的条件是()A、Q.front==Q.rearB、Q.front!=Q.rearC、Q.front==(Q.rear+1)%nD、Q.front!=(Q.rear+1)%n10.若在一个大小为6 的数组上实现循环队列,且当前rear 和front 的值分别为0 和3,当从队列中删除一个元素,再加入两个元素后,rear 和front 的值分别为()A、1,5B、2, 4C、4,2D、5,111.用单链表表示的链式队列的队头在链表的()位置A、链头B、链尾C、链中12.判定一个链队列Q(最多元素为n 个)为空的条件是()A、Q.front==Q.rearB、Q.front!=Q.rearC、Q.front==(Q.rear+1)%nD、Q.front!=(Q.rear+1)%n13.在链队列Q 中,插入s 所指结点需顺序执行的指令是()A 、Q.front->next=s;f=s;B 、Q.rear->next=s;Q.rear=s;C 、s->next=Q.rear;Q.rear=s;D 、s->next=Q.front;Q.front=s;14.在一个链队列Q 中,删除一个结点需要执行的指令是()A、Q.rear=Q.front->next;B、Q.rear->next=Q.rear->next->next;C、Q.front->next=Q.front->next->next;D、Q.front=Q.rear->next;15.用不带头结点的单链表存储队列,其队头指针指向队头结点,队尾指针指向队尾结点,则在进行出队操作时()A、仅修改队头指针B、仅修改队尾指针C、队头尾指针都要修改D、队头尾指针都可能要修改。

数据结构第三章习题

数据结构第三章习题

free(q);
return(p);
}
top2 是栈 2 的栈指针, 当 top2=top1+1 时出现上溢出, 当 top1=0 出, 当 top2=m0+1 时栈 2 出现下溢出。根据上述原理得到如下 函数:
时栈 1 出现下溢
top1
top2
c 的元素序号 1 2
…… .. n
…… ..
a1 a2 ……a n ……….bm ……… b2 b1
p1=n, 则 pi 为

A.i. B. n=I C. n- i+1 D.
不确定
4 .栈结构通常采用的两种存储结构是

A. 顺序存储结构和链表存储结构 B. 散链方式和索引方式
C. 链表存储结构和数组 D. 线性存储结构和非线性存储结构
5 .判定一个栈 ST (最多元素为 m0 )为空的条件是 。
A. ST->top<>0 B. ST->top=0

3.3 顺序栈习题解析
1. 对于一个栈, 给出输入项 A,B,C. 如果输入项序列由 A,B,C 所组成,是给出全部可能
的输出序列。
解: 本题利用栈的 “后进先出 ”的特点, 有如下几种情况:
A进 A出B 进B出C进C出
产生输出序列 ABC
A进 A出B 进C进C出B 出
产生输出序列 ACB
A进 B进B 出 A 出 C进C 出
D. s->next=f; f=s;
15. 在一个链队中,假设 f 和 r 分别为队首和队尾指针,则删除一个结点的运算时

A. r=f->next;
B. r=r->next;
C. f=f->next;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构第三章习题3.1 单项选择题2.一个栈的入栈序列a, b, c, d, e, 则栈的不可能的输出序列是。

A. edcbaB. DecbaC. DceabD. abcde3. 若已知一个栈的入栈序列是1,2,3,………..n, 其输出序列为p1, p2, p3,……,pn, 若p1=n, 则pi为。

. B. n=I C. n- i+1 D.不确定4.栈结构通常采用的两种存储结构是。

A. 顺序存储结构和链表存储结构B. 散链方式和索引方式C.链表存储结构和数组D. 线性存储结构和非线性存储结构5.判定一个栈ST(最多元素为m0)为空的条件是。

A. ST->top<>0B. ST->top=0>top<>m0 >top=m06.判定一个栈ST(最多元素为m0)为栈满的条件是。

A. ST->top!=0 >top==0>top!=m0 >top==m07.栈的特点是,队列的特点是。

A先进先出 B. 先进后出8. 一个队列的入栈序列是1,2,3,4,则队列的输出序列是。

A. 4,3,2,1B. 1,2,3,4C. 1,4,3,2D. 3,2,4,19. 判定一个队列QU(最多元素为m0)为空的条件是。

>rear- QU->front==m0>rear- QU->front-1==m0>front== QU->rearD. QU->front== QU->rear+110.判定一个队列QU(最多元素为m0)为满队列的条件是。

>rear- QU->front==m0>rear- QU->front-1==m0>front== QU->rear>front== QU->rear+111. 判定一个循环队列QU(最多元素为m0)为空的条件是。

A. QU->front== (QU->rear+1)%m0B. QU->front!= (QU->rear+1)%m0>front== QU->rear>front!= QU->rear12. 判定一个循环队列QU(最多元素为m0)为满队列的条件是。

A. QU->front== (QU->rear+1)%m0B. QU->front!= (QU->rear+1)%m0>front== QU->rear>front!= QU->rear+112. 向一个栈顶指针为HS的链栈中插入一个s所指结点时,则执行。

HS->next=s;A. s->next=HS->next; HS->next=s;B. s->next=HS; HS=s;C. s->next=HS; HS=HS->next;13. 从一个栈顶指针为HS的链栈中删除一个结点时,用x保存被删结点的值,则执行。

A x=HS; HS=HS->next;B. x=HS->data;C. HS=HS->next; x=HS->data;D. x=HS->data; HS=HS->next;14. 在一个链队中,假设f和r分别为队首和队尾指针,则插入s所指结点的运算时。

A. f->next=s; f=s;B. r->next=s;r=s;C. s->next=r; r=s;D. s->next=f; f=s;15. 在一个链队中,假设f和r分别为队首和队尾指针,则删除一个结点的运算时。

A. r=f->next;B. r=r->next;C. f=f->next;D. f=r-next;3.2 填空题4.向栈中压入元素的操作是5.对栈进行退栈的操作是6.在一个循环队列中,队首指针指向队首元素的7.从循环队列中删除一个元素时,其操作是8.在具有个单元的循环队列中,队满时共有个元素9. 在栈顶指针为HS的链栈中,判定栈空的条件是。

10. 在栈顶指针为HS的链栈中,计算该链站中结点个数的函数时。

11. 在HQ的链队中,判定只有一个结点的条件是。

12. 在HQ的链队中,计算该链队中结点个数的函数是。

顺序栈习题解析1. 对于一个栈,给出输入项A,B,C. 如果输入项序列由A,B,C所组成,是给出全部可能的输出序列。

解:本题利用栈的“后进先出”的特点,有如下几种情况:A进A出B进B出C进C出产生输出序列ABCA进A出B进C进C出B出产生输出序列ACBA进B进B出 A出 C进C出产生输出序列BACA进B进B出C进C出A出产生输出序列BCAA进B进C进C出B出 A出产生输出序列CBA不可能产生的输出序列CAB2.有两个栈s1和s2共享存储空间c[1,m], 其中一个栈底设在c[1]处,另一个栈底设在c[m0]处,分别编写s1和s2的进栈push( i,x)、退栈pop(i)和设置栈空setnull(i)的函数,其中i=1,2。

注意:仅当整个空间c[1,m0]占满时才产生上溢。

解:该共享栈的结构如图所示,两栈的最多元素个数为m0, top1是栈1的栈指针,top2 是栈2的栈指针,当top2=top1+1时出现上溢出,当top1=0时栈1出现下溢出,当top2=m0+1时栈2出现下溢出。

根据上述原理得到如下函数:top1 top2c的元素序号1 2 …….. n …….. m0-1 m0栈1底栈1顶栈2顶栈2底图共享栈/*top1,top2 和m0均为已赋初值的int型全局变量*/void push(x,i)int x,I{if (top1==top2-1) printf(“上溢出!\n”);elseif(i==1)/*对第一个栈进行入栈操作*/{top1++; c[top1]=x;}else /*对第二个栈进行入栈操作*/{top2--; c[top2]=x;}}/*函数pop*/void pop(i)int i ;{if (i ==1 )/*对第一个栈进行出栈操作*/if(top1==0)printf(“栈1下溢出!\n”); else{pop=c[top1]; top1--;}else /*对第二个栈进行出栈操作*/if (top2==m0+1) p rintf(“栈2下溢出!\n”); else{pop=c[top2];top2++;}}/*函数setnull*/setnull(i)int i ;{if(i ==1 )top1=0;else top2=m0+1;}4.证明:有可能从初始输入序列1,2,…….n, 利用一个栈得到输出序列p1,p2,…..,pn(p1,p2……pn是1,2,…..n 的一种排列)的充分必要条件是:不存在这样的i , j, k, 满足 i <j<k同时 pj<pk<pi.证明:【充分条件】如果不存在这样的i ,j,k 满足 i<j<k同时pj<pk<pi, 即对于输入序列:…,pj… pk,…pi,…, (pj<pk<pi)不存在这样的输出序列:…,pi… pj,…pk,…,(或简单地对于输入序列1,2,3不存在输出序列3,1,2)从中看到,pi 后进先出,是满足栈的特点,因为pi最大也就是在pj和pk之后进入,却在输出序列中排在pj和pk之前,同时也说明, 在pk之前先进入的pj不可能在pk之后出来,反过来说明满足先进后出的特点,所以构成一个栈。

【必要条件】如果初始输入序列是1,2,…,n,假设是进栈,又同时存在i ,j,k满足i<j<k同时pj<pk<pi,即对于输入序列:…,pj… pk,…pi,…, (pj<pk<pi)存在这样的输出序列:…,pi… pj,…pk,…,从中看到,pi 先进后出,是满足栈的特点,因为pi最大也就是在pj和pk之后进入,同时看到在pk之前先进入的pj 却在pk之前出来,反过来说明不满足先进后出的特点,与前面的假设是栈不一致,本题即证。

6. 已知两个整数集合A和B,它们的元素分别依元素值递增有序存放在两个单链表HA和HB中,编写一个函数求出这两个集合的并集C,并要求表示集合C的链表的结点仍依元素值递增有序存放。

解:假设HA和HB的头指针分别为ha和hb,先设置一个空的循环单链表HC,头指针为hc,之后依次比较HA和HB的当前结点的元素值,将较小元素值的结点复制一个并链接到HC的末尾,若相等,则将其中之一复制一个并链接到HC的末尾。

当HA或HB为空后,把另一个链表的余下结点都复制并链接到HC的末尾。

实现本题功能的函数如下:void union(ha,hb,hc)node *ha,*hb,*hc;{node *p,*q,*r,*s;hc={node *}malloc(sizeof(node));/*建立一个头结点, r总是指向HC链表的最后一个结点*/r=hc;p=ha;q=hb;while(p!=NULL&&q!=NULL){if (p->data<q->data){s=(node*)malloc(sizeof(node));s->data=p->data;r->next=s;r=s;p=p->next;}else if (p->data>q->data){s=(node*)malloc(sizeof(node));s->data=q->data;r->next=s;r=s;q=q->next;}else /*p->data==q->data的情况/{s={node*}malloc(sizeof(node));q=q->next;}}if(p==NULL)/* 把q及之后的结点复制到HC中*/ while (q!=NULL){s=(node*)malloc(sizeof(node));s->data=p->data;r->next=s;r=s;p=p->next;}r->next=NULL;s=hc;hc=hc->next;free(s); /*删除头结点*/}15. 假设在长度大于1的循环单链表中,既无头结点也无头指针,p为指向该链表中某个结点的指针,编写一个函数删除该结点的前驱结点。

解:本题利用循环单链表的特点,通过p指针可循环找到其前驱结点q及q的前驱结点 r,然后将其删除。

实现本题功能的函数如下:node *del(p)node *p;{node *q,*r;q=p; /*查找p结点的前驱结点,用q指针指向* /while(q->next!=p) q=q->next;r=q;/*查找q结点的前驱结点,用r指针指向*/while(r->next!=q) r=r->next;r->next=p;/*删除q所指的结点*/free(q);return(p);}。

相关文档
最新文档