数据结构练习1-08答案

2026/1/25 2:07:00

}

else p=p->next; }

5.设计一个带头结点的单链表L中删除一个最小值结点的算法。 Status DelMin(LinkList &L) { if(L->next) return ERROR;

minpre=ppre=L; minp=p=L->next; while(p)

{if(p->datadata) { minp=p; minpre=ppre;} ppre=p; p=p->next; }

minpre->next=minp->next; free(minp); }

6.已知3个单链表A、B、C中的结点均依元素值自小至大非递减排列(可能存在两个以上值相同的结点),设计一个算法使链表A中仅留下3个表中均包含的数据元素的结点,且没有值相同的结点,并释放所有无用结点。限定算法的时间复杂度为O(m+n+p),其中m、n、和p分别为3个表的长度。

7.两个整数序列A=(a1,a2,…,am)和B=(b1,b2,…,bn)用两个单链表存储,设计一个算法,判断序列B是否是序列A的子序列。 Status SubList(LinkList A,LinkList B) { pa=A->next; while(pa) { pb=B->next;

while(pa&&pa->data!=pb->data) pa=pa->next; //找到第一个元素相同的结点 ta=pa;

while(ta&&pb&&ta->data==pb->data) { ta=ta->next; pb=pb->next;} if(!pb) return TRUE; if(pa) pa=pa->next;

}

return FALSE; }

8.假设表达式中允许包含3种括号:圆括号、方括号、大括号。设计一个算法采用顺序栈判断表达式中的括号是否正确配对。

9.设以整数序列1,2,3,4作为顺序栈st的输入,利用push(进栈)和pop(出栈)操作,写出所有可能的输出并编程实现算法。

void p(SqStack &S,int k,int *out,int i)//从k开始的可能的出栈序列放到out[i]中 { int x;

if(k<=n) //第一种情况:如果站外有车,那么车k入站. { Push(S,k); p(S,k+1,out,i);

Pop(S,x); //恢复为原来的状态,即把车k恢复在站外的位置(回溯) }

if(!StackEmpty(S)) //第二种情况:如果站内有车,车m出站; { Pop(S,x); out[i++]=x;

if(i>=n&&StackEmpty(S)) //判断如果已经全部出站,那么我们可以打印了. print(out,i); p(S,k,out,i);

Push(S,x); i--; //恢复站内的状态,即把车m退回到站内;(这里也是回溯) } }

10.设计一个算法,利用栈的InitStack()、Push()、Pop()和StackEmpty( )等基本运算返回指定栈中栈底元素。 Status GetBase(Stack S, SElemType &e) { InitStack(T);

while(!StackEmpty (S)) {Pop(S,e); Push(T,e);} while(!StackEmpty (T)) {Pop(T,e); Push(S,e);} return OK; }

11.假设I和O分别表示入栈和出栈操作,栈的初态和终态均为空,入栈和出栈

的操作序列可表示为仅由I和O组成的序列。 (1)下面所示的序列中那些是合法的? A.IOIIOIOO B.IOOIOIIO C.IIIOIOIO D.IIIOOIOO

(2)通过对(1)的分析,写出一个算法判定所给的操作序列是否合法。若合法返回1,否则返回0(假设被判定的操作序列已存入一维数组中) Status Panduan(char *t) { InitStack(S); while(*t)

{switch(*t)

{case ‘I’: Push(S,*t); break;

case ‘O’:if(!StackEmpty (S)) { Pop(S,e); break;} else return 0;

} t++; }

if(!EmptyStack(T)) return 1; return 0; }

12.设计一个算法,利用队列的基本运算返回指定队列中的队尾元素。 Status GeTail(Queue Q, QElemType &e) { InitQueue(T);

while(!QueueEmpty (Q))

{DeQueue(Q,e); EnQueue(T,e);} while(!QueueEmpty (T))

{DeQueue(T,e); EnQueue(Q,e);} return OK; }

13.设计一个环形队列,用front和rear分别作为队头和队尾指针,另外用一个

标志tag表示队列是空(0)还是不空(1),这样就可以用front=rear作为队满的条件,要求设计队列的相关基本运算方法

#define MAXQSIZE 100 ∥最大队列长度 typedef struct

{QElemType *base; ∥初始化的动态分配存储空间

int front; ∥头指针,若队列不空,指向队列头元素

int rear; ∥尾指针,若队列不空,指向队列尾元素的下一个位置 int tag; //队列是否满的标识 }SqQueue;

Statue InitQueue(SqQueue &Q) {∥ 构造一个空队列Q

Q.base = (QElemType *)malloc(MAXQSIZE *

sizeof(QElemType)); if (!Q.base) exit(OVERFLOW); ∥存储分配失败 Q.front = Q.rear = 0;

Q.tag=0; //不满 return OK;

}

Status EnQueue(SqQueue &Q,QElemType e) {∥ 插入元素e为Q的新的队尾元素

if(Q.tag==1) return ERROR; Q.base[Q.rear] = e;

Q.rear = (Q.rear+1)% MAXQSIZE; if(Q.rear == Q.front) Q.tag=1; return OK; }

Status DeQueue(SqQueue &Q, QElemType &e) {∥ 删除队头元素,送给变量e

if(Q.tag==0) return ERROR; ∥队列空 e=Q.base[Q.front];

Q.front = (Q.front+1)% MAXQSIZE; if(Q.front= =Q.rear) Q.tag=0; return OK; }

∥队列满


数据结构练习1-08答案.doc 将本文的Word文档下载到电脑
搜索更多关于: 数据结构练习1-08答案 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219