线性表存储结构详解及链表操作复杂度对比

1 下载量 81 浏览量 更新于2024-08-24 收藏 303KB PDF 举报
在《数据结构教程(第五版)》清华大学出版社的课后习题答案中,第二章讨论了线性表的相关概念和存储结构。线性表是数据结构中的基础,主要有两种主要的存储方式:顺序存储结构和链式存储结构。 顺序存储结构的特点包括: 1. 存储密度大,因为每个元素只包含数据域,无额外的指针域; 2. 需要连续的存储空间,可能导致空间利用率不高; 3. 具有随机存取特性,可以通过逻辑序号直接访问元素; 4. 插入和删除操作代价较高,可能需要移动大量元素。 链式存储结构的特点则为: 1. 存储密度小,每个节点包含数据域和指针域; 2. 存储空间利用率高,因为节点独立分配; 3. 不具备随机存取,依赖于指针移动; 4. 插入和删除操作效率高,只需要更新指针。 单链表设置头结点的作用: 1. 提高插入和删除操作的效率,方便在任意位置进行操作; 2. 简化表为空或非空的判断,统一处理; 3. 便于在链表中添加新的节点,尤其是作为表的开始或结束。 针对题目中提到的线性表的各种运算,不同的存储结构有不同的时间复杂度: - 顺序表: - 查找第i个元素:O(1)(如果采用顺序查找) - 插入/删除操作:时间复杂度通常为O(n),因为需要移动其他元素。 - 带头结点的单链表: - 查找:O(n) - 插入/删除:O(1),但不包括头结点,因为头结点不存储实际数据。 - 循环链表: - 类似单链表,但查找可能需要遍历整个列表,O(n)。 - 双链表(无论是带头结点还是不带头结点的循环双链表): - 查找:O(n) - 插入/删除:O(1),双链表提供了前后节点的指针,操作更便捷。 总结来说,选择哪种存储结构取决于具体的应用场景和需要执行的操作频率。顺序表适合于经常需要随机访问元素的情况,而链表更适合频繁插入和删除操作,特别是头部和尾部的插入。循环链表则适用于需要高效地在表头或表尾进行插入和删除的场合。双链表提供了双向访问的优势,但额外的指针增加了存储开销。
2019-02-05 上传
1. 顺序存储结构中数据中数据元素之间逻辑关系是由( )表示的,链接存储结构中的数据元素之间的逻辑关系是由( )表示的。 A.线性结构 B.非线性结构 C.存储位置 D.指针 2. 线性表是( )。 A.一个有限序列,可以为空 B. 一个有限序列,不能为空 C. 一个无限序列,可以为空 D. 一个无限序列,不能为空 3. 已知一维数组A采用顺序存储结构,每个元素占用4个存储单元,第9个元素的地址为144,则第一个元素的地址是( )。 A. 108 B. 180 C. 176 D. 112 4. 在单链表中删除指针p所指结点的后继结点,则执行( )。 A. p->next= p->next->next B. p->next= p->next C. p= p->next->next D. p= p->next; p->next= p->next->next 5. 若某链表最常用的操作是在最后一个结点之后插入一个结点删除最后一个结点,则采用( )存储方式最节省时间。 A. 单链表 B. 双链表 C. 带头结点的双循环链表 D. 单循环链表 6.二维数组A[7][8]以列序为主序的存储, 计算数组元素A[5][3] 的一维存储空间下标 k=( )。 A. 38 B. 43 C. 26 D. 29 二、完成下列填空题(每空3分,共9分)。 1.在顺序表L中第i个位置上插入一个新的元素e: Status ListInsert_Sq(SqList &L , int i , ET e){ if ( iL.length+1) return ERROR; if(L.length >= L.listsize){ p=(ET*)realloc(L.elem,(L.listsize+10)*sizeof(ET)); if (p==NULL) exit(OVERFLOW); L.elem=p; } for( j=L.length ; j>=i ; --j ) L.elem[j]=L.elem[j-1] ; L.elem[j]=e ; ++L.length ; return OK; } 2. 删除双向链表中p所指向的节点算法: status delete(DuLinkList L, DuLinkList p) { if (p= =L) return ERROR; else { p->prior->next=p->next; p->next->prior=p->prior ; } free(p); return OK; } 三、编程题(共27分)。 1. (共12分)用顺序表表示集合,设计算法实现集合的求差集运算,要求不另外开辟空间。 顺序表的存储结构定义如下: #define Maxsize 100 typedef struct { ElemType data[MaxSize]; // ElemType表示不确定的数据类型 int length; // length表示线性表的长度 }SqList; 将如下函数,伪码补充完整(8分),代码前先用文字描述自己的算法思想(4分)。 文字描述算法:略(4分) void Difference(SqList A, SqList B) {//参考代码如下如下(8分) for (i=0;i<A.length;i++) for(j=0;j<B.length;j++) if(A.data[i]==B.data[j]) { A.data[i]=’#’; break; } for (k=0,i=0;inext == L) return; p = L; while (p->next != L)   { if (p->next->data != e) P = p->next; else { q = p->next;p->next = q->next; free(q);} } } 时间复杂度分析:(2分) 时间复杂度为O(n)。