收藏 分享(赏)

南工大第二章 线性表.doc

上传人:精品资料 文档编号:10667762 上传时间:2019-12-17 格式:DOC 页数:72 大小:121.41KB
下载 相关 举报
南工大第二章 线性表.doc_第1页
第1页 / 共72页
南工大第二章 线性表.doc_第2页
第2页 / 共72页
南工大第二章 线性表.doc_第3页
第3页 / 共72页
南工大第二章 线性表.doc_第4页
第4页 / 共72页
南工大第二章 线性表.doc_第5页
第5页 / 共72页
点击查看更多>>
资源描述

1、数据结构与算法上机作业第二章 线性表一、选择题1、若长度为 n 的线性表采用顺序存储结构,在其第 i 个位置插入一个新的元素算法的时间复杂度为 c 。A. O(log2n) B. O(1) C. O(n) D. O(n2)2、以下关于线性表的说法中,不正确的是 c 。A. 线性表中的数据元素可以是数字、字符、结构等不同类型B. 线性表中包含的数据元素个数不是任意的C. 线性表中的每一个结点都有且只有一个直接前驱和直接后继D. 存在这样的线性表:表中各结点都没有直接前驱和直接后继3、在有 n 个结点的顺序表上做插入、删除结点运算的时间复杂度为 b 。A. O(1) B. O(n) C. O(n2

2、) D. O(log2n)4、等概率情况下,在有 n 个结点的顺序表上做插入结点操作,需平均移动的结点数目为 d 。A. n B. (n-1)/2 C. n/2 D. (n+1)/25、在一个长度为 n 的顺序存储的线性表中查找值为 x 的元素时,平均查找长度(及 x 同元素的平均比较次数,假定查找每个元素的概率都相等)为 b 。A. n B. n/2 C. (n+1)/2 D. (n-1)/26、在顺序表中,只要知道 d ,就可以求出任一结点的存储地址。A. 基地址 B. 结点大小 C. 向量大小 D. 基地址和结点大小7、将两个各有 n 个元素的有序表归并为一个有序表,其最少的比较次数是

3、a 。A. n B. 2n-1 C. 2n D. n-18、线性表采用链表存储时其存储地址要求 d 。A. 必须是连续的 B. 部分地址必须是连续的C. 必须是不连续的 D. 连续的和不连续的都可以9、下面关于线性表的描述中,错误的是 d 。A. 线性表采用顺序存储,必须占用一片连续的存储单元B. 线性表采用顺序存储,便于进行插入和删除操作C. 线性表采用链式存储,不必占用一片连续的存储单元D. 线性表采用链式存储,便于插入和删除操作10、向具有 n 个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是 b A. O(1) B. O(n) C. O(n2) D. O(log2n)11、在

4、一个带头结点的单链表 HL 中,若要向表头插入一个由指针 p 指向的结点,则执行的语句是 B 。A. HL=p; p-next=HL; B. p-next=HL; HL=p;C. p-next=HL; p=HL; D. p-next=HL-next; HL-next=p;12、在一个单链表 HL 中,若要删除由指针 q 所指向结点的后继结点,则执行的语句是 C 。A. p=q-next; p-next=q-next;B. p=q-next; q-next=p;C. p=q-next; q-next=p-next;D. q-next=q-next-next; q-next=q;13、设有编号为

5、1, 2, 3, 4 的 4 辆列车,顺序进入一个栈结构的站台,下列不可能的出栈顺序为 D 。A. 1234 B. 1243 C. 1324 D. 142314、4 个元素按 A, B, C, D 顺序进入 S 栈,执行两次 Pop(S, x)运算后,栈顶元素的值是 B 。A. A B. B C. C D. D15、从一个栈顶指针为 top 的链栈中删除一个结点时,用 x 保存被删除的结点,应执行下列D 命令。A. x=top; top=top-next; B. top=top-next; x=top-data;C. x=top-data; D. x=top-data; top=top-nex

6、t;16、向顺序栈中输入元素时 B 。A. 先存入元素,后移动栈顶指针 B. 先移动栈顶指针,后存入元素C. 谁先谁后无关紧要 D. 同时进行17、设有一个顺序栈,元素 A, B, C, D, E, F 依次进栈,如果 6 个元素出栈的顺序是 B, D, C, F, E, A,则栈的容量至少为 A 。A. 3 B. 4 C. 5 6. 618、设已将元素 A, B, C 依次入栈,元素 D 正等待进栈。那么下列 4 个序列中不可能出现的出栈顺序为 A 。A. CADB B. CBDA C. CDBA D. DCBA19、栈和队列的相同之处是 C 。A.元素的进出满足先进后出 B.元素的进出满足

7、后进先出 C.只允许在端点进行插入和删除操作 D.无共同点 20、设栈 S 和队列 Q 的初始状态为空,元素 e1,e2,e3 ,e4,e5 和 e6 依次通过栈,一个元素出栈后即进入队列 Q,若 6 个元素出队的序列是 e2,e4,e3,e6 ,e5,e1,则栈 S 的容量至少应该是 C 。 A. 6 B. 4 C. 3 D. 2 21、队列通常采用的两种存储结构是( A) 。A. 顺序存储结构和链式存储结构 B.散列方式和索引方式C. 链表存储结构和线性存储结构 D.线性存储结构和非线性存储结构22、循环队列 SQ 队满的条件是 B 。A. SQ-rear=SQ-front B. (SQ-

8、rear+1)%MAXLEN=SQ-frontC. SQ-rear+2 = SQL-front D. (SQ-rear+2)%MAXLEN=SQL-front23、若用一个大小为 6 的数组来实现循环队列,且当前 front 和 rear 的值分别为 3 和 0,当从队列中删除一个元素,再加入两个元素后,front 和 rear 的值分别为 B 。A. 5 和 1 B. 4 和 2 C. 2 和 4 D. 1 和 524、链栈与顺序栈相比,有一个较为明显的优点是 A 。A. 通常不会出现满栈的情况 B. 通常不会出现栈空的情况C. 插入操作更加方便 D. 删除操作更加方便25、设用一个大小为

9、M=60 的顺序表 AM表示一个循环队列,如果当前的尾指针rear=32,头指针 front=15,则当前循环队列的元素的个数为 C 。A. 42 B. 17 C. 18 D. 4126、串是一种特殊的线性表,其特殊性体现在 D 。A. 可以顺序存储 B. 数据元素是一个字符C. 可以链式存储 D. 数据元素可以是多个字符27、设主串的长度为 n,模式串的长度为 m,则串匹配的 KMP 算法的时间复杂度为 C 。A. O(m) B. O(n) C. O(m+n) D. O(mn)28、已知串 S=“abab”,其 Next 数组值为 B 。A. 0123 B. 0121 C. 0112 D.

10、012229、若字符串“ABCDEFG”采用不带表头的链式存储,每个结点保存一个字符。假设每个字符占用 1 个字节,每个指针占用两个字节,则该字符串的存储密度为 D 。A. 20% B. 40% C. 50% D. 33.3%30、在双向链表中,在指针 p 所指的结点前插入一个指针 q 所指向的结点,操作是 A 。A. p-Prior=q; q-Next=p; p-Prior-next=q; q-Prior=q;B. p-Prior=q; p-Prior-next=q; q-next=p; q-Prior=p-Prior;C. q-Next=p; q-Prior=p-Prior; p-Prio

11、r-Next=q; p-Prior=q;D. q-Prior=p-Prior; q-Next=q; p-Prior=q; p-Next=q;31、已知循环队列存储在一维数组 A0n-1中,且队列非空时 front 和 rear 分别指向对头元素和队尾元素,且要求第一个进入队列的元素存储在 A0处,则初始时 front 和 rear 的值分别是 D 。A. 0, 0 B. 0, n-1 C. n-1, 0 D. n-1, n-132、某队列允许在两端进行入队操作,但仅允许在一端进行出队操作(称为输出受限的双端队列) ,若 a, b, c, d, e 元素依次进队,则不可能得到的顺序是 C 。A.

12、 bacde B. dbace C. dbcae D. ecbad33、在双向链表中间插入一个结点时,需要修改 D 个指针域。A. 1 B. 2 C. 3 D. 434、在按行优先顺序存储的三元组表中,下述陈述错误的是 D 。A. 同一行的非零元素,是按列号递增次序存储的B. 同一列的非零元素,是按行号递增次序存储的C. 三元组表中三元组行号是非递减的D. 三元组表中三元组列号是非递减的35、在稀疏矩阵的三元组表示法中,每个三元组表示 D 。A. 矩阵中非零元素的值B. 矩阵中数据元素的行号和列号C. 矩阵中数据元素的行号、列号和值D. 矩阵中非零数据元素的行号、列号和值36、对特殊矩阵采用压

13、缩存储的目的主要是为了 C 。A. 表达变得简单 B. 对矩阵元素的存取变得简单C. 去掉矩阵中的多余元素 C. 减少不必要的存储空间37、广义表是线性表的推广,它们之间的区别在于 A 。A. 能否使用子表 B. 能否使用原子项C. 表的长度 D. 是否能为空38、已知广义表(a, b, c, d)的表头是 A ,表尾是 D 。A. a B. () C. (a, b, c, d) D. (b, c, d)39、下面说法不正确的是 A 。A. 广义表的表头总是一个广义表 B. 广义表的表尾总是一个广义表C. 广义表难以用顺序存储结构表示 D. 广义表可以是一个多层次的结构40、若广义表 A 满足

14、 Head(A)=Tail(A),则 A 为 C 。A. ( ) B. () C. ( ),( ) D. ( ), ( ), ( )二、填空题1、线性表中结点的集合是有限的,结点之间的关系是 一对一 关系。2、顺序表中访问任一个结点的时间复杂度为 O(1) 。3、线性表中第一个结点没有直接前驱,称为 头 结点。4、在一个长度为 n 的顺序表中删除第 i 个元素,要移动 n-i 个元素。5、在一个长度为 n 的顺序表中,如果要在第 i 个元素前插入一个元素,要后移 n-i+1 个元素,在插入操作中,移动元素的均值为 (n+1)/2 。6、根据线性表的链式存储结构中每一个结点包含的指针个数,将线性

15、链表分成 单向链表 和双向链表 。7、链式存储的特点是利用 指针 来表示数据元素之间的逻辑关系。8、静态链表(线性表的游标实现 )是指用 游标/ 数组下标 表示单链表的指针。9、在静态链表中,一般都有一个变量 available 表示的结点链,其中的结点为 空闲节点 。10、在栈中,可进行插入和删除操作的一端称 栈顶 。11、在进栈运算时,应先判别栈是否 为满 。在出栈运算时应先判别栈是否 为空 。当栈中元素为 n 个时,进栈运算时发生上溢,则说明该栈的最大容量为 n 。12、设有一空栈,现有输入序列为 1, 2, 3, 4, 5,经过 push, push, pop, push, pop,

16、push, push, pop, pop 之后,输出序列为 push 。13、对于循环向量的循环队列,求队列长度的公式为 (rear-front+n+1)%n 。14、栈的逻辑特点是 先进后出 。队列的逻辑特点是 先进先出 。两者的共同特点是只允许在它们的 端点 出插入和删除数据元素,区别是 栈在顶点进行插入和删除,而队列在队首进行删除,在队尾进行插入 。15、链队列 LQ 为空时,LQ-front-next= NULL/LQ-rear .16、在一个链队列中,若队首指针为 front,队尾指针为 rear,则判断该队列只有一个结点的条件为 front-rear=1/front-next=re

17、ar 。17、设串 S=“Ilikecomputer”,T= “com”,则 Length(S)= 14 。Index(S, T)= 6 。18、在 KMP 算法中,nextj 只与主窜 S 串有关,而与 子串 无关。19、字符串“ababaab“的 Next 数组值是 0121301 。20、稀疏矩阵一般压缩存储的方式有三种,分别是 三元组存储,行指针链表 、 和 十字链表 。21、二维数组 M 中每个元素的长度是 3 字节,行下标 i 从 07,列下标 j 从 09,从首地址int main()int a10 = 0,1,2,3,4;int b5 = 5,6,7,8,9;for (int

18、i = 5; i using namespace std;struct ListNodeint m_nValue;ListNode *m_pNext;/合并两个有序链表,非递归方法 ListNode *MergeTwoList(ListNode *pListOneHead, ListNode *pListTwoHead)if (pListOneHead = NULL)return pListTwoHead;if (pListTwoHead = NULL)return pListOneHead;ListNode *pNode1 = pListOneHead;ListNode *pNode2 =

19、pListTwoHead;ListNode *pMergeListHead = NULL;ListNode *pCurLastNode = NULL;if (pNode1-m_nValue m_nValue)pMergeListHead = pListOneHead;pNode1 = pNode1-m_pNext;pCurLastNode = pMergeListHead;elsepMergeListHead = pListTwoHead;pNode2 = pNode2-m_pNext;pCurLastNode = pMergeListHead;while (pNode1 != NULL pC

20、urLastNode = pNode1;pNode1 = pNode1-m_pNext;elsepCurLastNode-m_pNext = pNode2;pCurLastNode = pNode2;pNode2 = pNode2-m_pNext;if (pNode1 = NULL)pCurLastNode-m_pNext = pNode2;if (pNode2 = NULL)pCurLastNode-m_pNext = pNode1;return pMergeListHead;/创建一个链表,输入从头到尾结点的值,输入-1表示结束 void CreateList(ListNode *List

21、Node *pCurLastNode = NULL;bool isHead = true;while (1)if (isHead)pHead = new ListNode();cin pHead-m_nValue;if (pHead-m_nValue = -1)pHead = NULL;break;pHead-m_pNext = NULL;isHead = false;pCurLastNode = pHead;elsepListNode = new ListNode();cin pListNode-m_nValue;if (pListNode-m_nValue = -1)break;pList

22、Node-m_pNext = NULL;pCurLastNode-m_pNext = pListNode;pCurLastNode = pListNode;/从头到尾打印链表 void PrintList(ListNode *while (pCur != NULL)cout m_nValue m_pNext;cout m_nValue #include #include /先自定义一个结构体 struct Test int member1;int member2;/自定义排序函数 bool SortByM1(const Test test.member1 = m1;test.member2 =

23、 m2;vecTest.push_back(test);void PrintVector(std:vector it != vec.end(); it+)std:cout member1 member2 vecTest;MyPushback(vecTest, 9, 1);MyPushback(vecTest, 8, 2);MyPushback(vecTest, 7, 3);MyPushback(vecTest, 6, 4);MyPushback(vecTest, 5, 5);MyPushback(vecTest, 4, 6);MyPushback(vecTest, 3, 7);MyPushba

24、ck(vecTest, 2, 8);MyPushback(vecTest, 1, 9);/排序之前 std:cout m_Value = pNode-m_Value;pCloneHead-pNext = NULL;pCloneNode = pCloneHead;pNode = pNode-pNext;while (pNode != NULL)ListNode* pTempNode = new ListNode();pTempNode-m_Value = pNode-m_Value;pTempNode-pNext = NULL;pCloneNode-pNext = pTempNode;pClon

25、eNode = pCloneNode-pNext;pNode = pNode-pNext;return pCloneHead;bool printList(ListNode* pHead)ListNode* pNode = pHead;if (pNode = NULL)return false;while (pNode)cout m_Value pNext;return true;ListNode * CreatList()ListNode * pHead = new ListNode();pHead-m_Value = 1;pHead-pNext = NULL;ListNode* pNode

26、 = pHead;for (int i = 2; i m_Value = i;pTempNode-pNext = NULL;pNode-pNext = pTempNode;pNode = pNode-pNext;return pHead;int main()ListNode* pHead = CreatList();if (CloneList(pHead)printList(pHead);elsecout using namespace std;typedef int Elementtype;struct celltype Elementtype element;celltype *next;

27、 /*结点型*/typedef celltype *LIST;typedef celltype *position;position End(LIST L)position q;q = L;while (q-next != NULL)q = q-next;return (q); /时间复杂性:O(n)void Insert(Elementtype x, position p, LIST q = new celltype;q-element = x;q-next = p-next;p-next = q; /时间复杂性:O(1)position MakeNull(LIST L-next = NUL

28、L;return L; /时间复杂性:O(1)void print(position p)int count = 0;cout next != NULL)flg = 1;p = p-next;coutelement x;Insert(x, p, L);print(p);int Delete(int x,LIST position p1 = 0,p2=0;cout x;if (L-element = x)p1 = L;L = L-next;delete p1;return m;elsep1 = p2 = L;while (p1-element != x m+;p1 = p1-next; p2-n

29、ext;p2-next = p1-next;delete p1;return m;return -1;int main()LIST L;Elementtype x = 1;position p = MakeNull(L);CreateList(x, p, L);Delete(x, L);print(p);system(“pause“);return 0;七、写出一个将两个静态链表(属于同一个存储池)合并的算法函数:void Merge(cursor M, cursor N); 合并的方法是将 N 链表中的所有结点添加到 M 链表的后面,并将 N 链表的表头结点添加到空闲结点链表中。要求:1、定

30、义静态链表的结点的结构以及结点的型 SPACE 以及位置(position)和游标(cursor )的型。2、定义静态链表的基本操作:void Initialize(); 初始化,将所有存储池中的结点设置为空闲;cursor GetNode(); 从空闲链中获取一个结点;void FreeNode(cursor q); 将结点 q 加入到空闲链; void Insert ( elementtype x, position p, cursor M ); 在链表 M 中的位置为 p 的元素后面添加一个值为 x 的结点;void Delete (cursor M, position p ); 在链表

31、 M 中删除位置为 p 的元素的后一个元素。3、在 1、2 的基础上完成本题。4、在 main 函数中进行测试:先构建一个存储池,然后在该存储池中创建两个静态表,最后将这两个静态表合并。/运行时Merge(M,N)函数不知道出了什么问题?暂时无法解决#includeusing namespace std;#define maxsize 100typedef int elementtype;typedef struct elementtype element;int next; spacestr; /*结点类型*/spacestr SPACEmaxsize;/*存储池*/typedef int

32、position, cursor;cursor available;void Initialize()int j;/* 依次链接池中结点*/for (j = 0; jmaxsize - 1; j+)SPACEj.next = j + 1;SPACEj.next = -1; /* 最后一个接点指针域为空*/available = 0; /* 标识线性表*/ 可用空间的分配操作cursor GetNode() / q=new spacestr ;cursor p;if (SPACEavailable.next = -1)p = -1;elsep = SPACEavailable.next;SPAC

33、Eavailable.next = SPACEp.next;return p;/* 从池中删除*/void FreeNode(cursor q) /delete q;SPACEq.next = SPACEavailable.next;SPACEavailable.next = q;/* 放回池中*/ 在位置p后面插入元素值为x的结点void Insert(elementtype x, position p)position q;q = GetNode();SPACEq.element = x;SPACEq.next = SPACEp.next;SPACEp.next = q;/ 删除位置p后的

34、一个结点void Delete(position p)position q;if (SPACEp.next != -1)q = SPACEp.next;SPACEp.next = SPACEq.next;FreeNode(q);void Merge(cursor M, cursor N)cout “n合并后的数组是:“ endl;position p = M; position q = N; while (SPACEq.next != -1)SPACEp.next = q;p = SPACEp.next;q = SPACEq.next;position r = available; SPACE

35、N.next = r; available = N;void Insert(elementtype x, position p, cursor M)position q;q = GetNode(); SPACEq.element = x; SPACEq.next = SPACEp.next; SPACEp.next = q;void Delete(cursor M, position p)position q; q = GetNode();if (SPACEp.next != -1) if (SPACESPACEp.next.next != -1) q = SPACEp.next; SPACEp.next = SPACEq.next; FreeNode(q);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报