1、while (n = (s + 1) * (s + 1)s = s + 1;语句 “s = s + 1;”执行次,故该程序段得时间复杂度为O().13.x = 1; sum = 0; for (i = 0; x = x * i;sum = sum + x;语句 “x = x * i”与“sum = sum + x;”各执行n次,故该程序段得时间复杂度为O(n).14.for (i = 1; i+) if (3 * i =n) for (j = 3 * i; j+) x+; y = 3 * x + 2; 语句 “x+”与“y = 3 * x + 2;15.for (i = 1; for (j =
2、 1;= i; x = x + 1; 语句 “x = x + 1;16.sum = 0; i = 0; while (i = 100) sum = sum + i; i+; 语句 “sum = sum + i;”与“i+;”各执行100次,故该程序段得时间复杂度为O(1).17.x = 1; s = 0; for (i = 1; +x; s += x; for (j = 1; for (k = 1; k next = headC.head - next = NULL D.head = NULL4.在单循环链表中,p指向表任一结点,判断表不就是访问结束得条件就是 (B)A.p != NULL B
3、.p != head C.p - next != head D.p -= NULL5.在一个单链表中,已知q指向p所指向结点得前趋结点,若在p、q所指结点之间插入一个s所指向得新结点,则执行得操作就是 (A)A.q - next = s; s - next = p B.p - next = q C.s - next = p - next; p - next = s D.p - next = s - next = p6.在一个单链表中,若删除p指向结点得后继结点,则执行得操作就是 (A)A.q = p - next - free(q);B.p = p - q = p - p = q -C.q =
4、 p - p = p -D.p = p -7.在一个长度为n得顺序表中删除第i个元素,需要向前移动n - i个元素.8.在顺序表中插入或删除一个元素,需要平均移动表长得一半个元素,具体移动得元素个数与插入或删除得位置有关.9.顺序表中逻辑上相邻得元素在物理存储位置上一定相邻,链表结构中逻辑上相邻得元素在物理位置上不一定相邻.10.已知顺序表中一个元素得存储位置就是x,每个元素占c个字节,求其后继元素位置计算公式为x + c,而已知单链表中某一结点由p指向,求此后继结点存储地址得操作为p - next.11.在用p指针访问单链表时,判断不就是访问结束得条件就是p != NULL;在访问单循环链表
5、时,判断不就是访问表结束得条件就是p != head.12.已知p指向双向链表得中间某个结点,从给定得操作语句中选择合适得填空.(1)在p结点后插入s结点得语句序列就是I、G、A、D.(2)在p结点前插入s结点得语句序列就是C、N、H、B.(3)删除p结点得直接后继结点得语句序列就是J、Q、E、M.(4)删除p结点得直接前趋结点得语句序列就是K、P、F、M.(5)删除p结点得语句序列就是O、R、L.A.p - next = s B.p - prior = s C.s -D.s - prior = p E.p - next F.p - prior = p - prior - priorG.p -
6、 prior = s H.p - next = s I.s - nextJ.q = p - next K.q = p - prior L.free(p)M.free(q) N.s - prior O.p -P.p - next = p Q.p - prior = p R.p -13.下面就是一个在带头结点得单链表head中删除所有数据域值为x得结点得算法,但不完善,请在相应得地方填上适当得语句,使之成为完整得算法.void DeleX(LinkList head, DataType x) LinkNode *p, *q, *s; P = head; while (q != NULL) if (
7、q - data = x) s = q; q = q - free(s); p - next = q; else p = q;三、算法设计题14.设有两个顺序表A与B,且都递增有序。试写一算法,从A中删除与B中相同得那些元素(即计算A - B).SeqList Subtraction(SeqList A, SeqList B) int i, j, k = 0;/令匹配位置为0 A、Length; i+) for (j = k; B、Length; j+)/从比较匹配得位置开始查起 if (A、Datai = B、Dataj) k = j; /记录比较到得位置 for (j = i; A、Len
8、gth - 1; A、Dataj = A、Dataj + 1;/删除相同得元素 A、Length-; break; return A;15.已知head就是指向一个带头结点得单链表得头指针,p指向该链表得任一结点。试写一算法,将p所指向得结点与其后继结点交换位置.void Exchange(LinkList head, LinkNode *p) LinkNode *q, *s, *r; if (q != NULL)/判断所指结点就是否就是最后一个结点 if (p = head)/判断所指结点就是否就是头结点 head = head -/头结点指针域所指结点变成新得头结点 s = head -/
9、记录第2个结点 head - next = p;/新得头结点指针域指向原头结点/原头结点变成第1个结点后指针域指向第2个结点 else r = head; while (r -= p) r = r-/查找p指向结点直接前趋 r -/p指向结点直接前趋指针域指向p指向结点直接后继 next = q -/p指向结点指针域指向p指向结点直接后继得直接后继 q -/p指向结点直接后继指针域指向p else printf(“p指向得结点无后继节点!”)16.已知两条单链表A与B分别表示两个集合,其元素值递增有序。试写一算法,求A与B得交集C,要求C同样以元素值递增得单链表形式存储.LinkList In
10、tersection(LinkList A, LinkList B) LinkNode *p, *q, *r, *s; LinkList C = (LinkNode *) malloc(SizeOf(LinkNode); r = C; p = A; s = B; while (p != null & q != null) if (p - data data) p = p - else if (p - data data) q = q - else s = (LinkNode *) malloc(SizeOf(LinkNode); s - data = p - data; s - next =
11、NULL; r - r = s; p = p -17.设有一个带头结点得双向循环链表,head为链表得头指针。试写一算法,实现在值为x得结点之前插入一个值为y得结点.void Insert(DlinkList head, DataType x, DataType y) DlistNode *p, *s; s = (DlistNode *) malloc(SizeOf(DlistNode); data = y; p = head -= head & data != x) p = p -/查找结点值为x得结点 if (p = head) printf(“没有值为x得结点!”); else prio
12、r; p - prior = s;第3章 栈与队列1.栈得操作原则就是 (C)A.顺序进出 B.后进后出 C.后进先出 D.先进先出2.进栈序列为a,b,c,则通过入出栈操作可能得到得a,b,c得不同排列个数为 (B)A.4 B.5 C.6 D.73.按字母a,b,c,d,e顺序入栈,则出栈得输出序列不可能就是 (B)A.decba B.dceab C.abcde D.edcba4.判断一个顺序栈st(最多元素为StackSize)为栈满得条件表达式就是 (D)A.st、top != StackSize B.st、top != 0 C.st、top != -1 D.st、top = Stack
13、Size - 15.在向顺序栈中压入元素时 (C)A.先存入元素,后移动栈顶指针 B.谁先谁后无关紧要C.先移动栈顶指针,后压入元素 D.同时进行6.一个队列得入队序列就是1,3,5,7,9,则出队得输出序列只能就是 (B)A.9,7,5,3,1 B.1,3,5,7,9C.1,5,9,3,7 D.9,5,1,7,37.判断一个顺序队列sq(最多元素为QueueSize)为空队列得条件表达式为 (A)A.sq、rear = sq、front B.sq、rear = 0C.sq、front = QueueSize D.sq、rear = QueueSize + 18.判断一个循环队列cq(最多元素
14、为QueueSize)为满队列得条件表达式为 (C)A.cq、rear = cq、front B.cq、rear = QueueSizeC.(cq、rear + 1) % QueueSize = cq、front D.cq、rear % QueueSize + 1 = cq、front9.假设以S与X分别表示进栈与退栈操作,则对输入序列a,b,c,d,e进行一系列栈操作SSXSXSSXXX之后,得到得输出序列为b、c、e、d、a.10.假设S、datamaxsize为一个顺序存储得栈,变量top指示栈顶元素得位置。能做进栈操作得条件就是S、top 0) S2、datatop2 = x; els
15、e S1、datatop2 = x;DataType Delete(SeqStack *S1, SeqStack *S2) if (top1 = top2) printf(“Queue Empty”); if (top1 1) x = S1、datatop1; else x = S2、datatop1; top1+; return x;21.试设计一个算法,实现输入一字符串并检查字符串中就是否含有圆括号,当圆括号匹配时输出括号内得字符串,否则给出出错信息(提示:利用栈记录左括号出现后得字符).string Match() InitStack(S); 、/初始化栈 ch = getchar();
16、 /读取第一个字符 while (ch != n) /当前字符不为结束字符时,进入循环 if (ch = () /检测到左括号 push(S,ch); /将左括号压入栈中 ch = getchar(); /读取下一个字符 while (ch != n & ch != ) /字符不为结束字符与右括号时,进入循环 push(S,ch); /将字符压入栈中 ch = getchar(); /读取下一个字符 else if (ch =) /读取到得字符为右括号时,进入循环 while (!StackEmpty(S) & GetTop(S) != () /栈不空且栈顶元素不为左括号,进入循环 putchar(pop(S); /退栈并输出退栈得字符 if (StackEmpty)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1