没有合适的资源?快使用搜索试试~ 我知道了~
数据结构课后习题答案第二章 线性表.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 123 浏览量
2022-11-12
13:10:47
上传
评论
收藏 710KB PDF 举报
温馨提示
试读
30页
...
资源推荐
资源详情
资源评论
第二章 线性表
2.1 描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。
并说明头指针和头结点的作用。
答:头指针是一个指针变量,里面存放的是链表中首结点的地址,并以此来标识
一个链表。如链表 H,链表 L 等,表示链表中第一个结点的地址存放在 H、L 中。
头结点是附加在第一个元素结点之前的一个结点,头指针指向头结点。当该链表
表示一个非空的线性表时,头结点的指针域指向第一个元素结点,为空表时,该
指针域为空。
开始结点指第一个元素结点。
头指针的作用是用来惟一标识一个单链表。
头结点的作用有两个:一是使得对空表和非空表的处理得以统一。二是使得在链
表的第一个位置上的操作和在其他位置上的操作一致,无需特殊处理。
2.2 填空题
1、在顺序表中插入或删除一个元素,需要平均移动(表中一半)元素,具体移
动的元素个数与(表长和该元素在表中的位置)有关。
2、顺序表中逻辑上相邻的元素的物理位置(必定)相邻。单链表中逻辑上相邻
的元素的物理位置(不一定)相邻。
3、在单链表中,除了首元结点外,任一结点的存储位置由(其直接前驱结点的
链域的值)指示。
4、在单链表中设置头结点的作用是(插入和删除元素不必进行特殊处理)。
2.3 何时选用顺序表、何时选用链表作为线性表的存储结构为宜?
答:在实际应用中,应根据具体问题的要求和性质来选择顺序表或链表作为线性
表的存储结构,通常有以下几方面的考虑:
1.基于空间的考虑。当要求存储的线性表长度变化不大,易于事先确定其大小
时,为了节约存储空间,宜采用顺序表;反之,当线性表长度变化大,难以估计
其存储规模时,采用动态链表作为存储结构为好。
2.基于时间的考虑。若线性表的操作主要是进行查找,很少做插入和删除操作
时,采用顺序表做存储结构为宜;反之, 若需要对线性表进行频繁地插入或删
除等的操作时,宜采用链表做存储结构。并且,若链表的插入和删除主要发生在
1
表的首尾两端,则采用尾指针表示的单循环链表为宜。
2.10 Status DeleteK(SqList &a,int i,int k)//删除线性表 a 中第 i 个元素起的 k 个元
素
{
if(i<1||k<0||i+k-1>a.length) return INFEASIBLE;
for(count=1;i+count-1<=a.length-k;count++) //注意循环结束的条件
a.elem[i+count-1]=a.elem[i+count+k-1];
a.length-=k;
return OK;
}//DeleteK
2.11 设顺序表中的数据元素递增有序,试写一算法,将 X 插入到顺序表的适当
位置上,以保持该表的有序性。
答:因已知顺序表 L 是递增有序表,所以只要从顺序表终端结点(设为 i 位置元
素)开始向前寻找到第一个小于或等于 x 的元素位置 i 后插入该位置即可。
在寻找过程中,由于大于 x 的元素都应放在 x 之后,所以可边寻找,边后移
元素,当找到第一个小于或等于 x 的元素位置 i 时,该位置也空出来了。
算法如下:
//顺序表存储结构如题 2.7
void InsertIncreaseList( Seqlist *L , Datatype x )
{
int i;
if ( L->length>=ListSize)
Error(“overflow");
for ( i=L -> length ; i>0 && L->data[ i-1 ] > x ; i--)
L->data[ i ]=L->data[ i-1 ] ; // 比较并移动元素
L->data[ i ] =x;
L -> length++;
}
2
2.12 int ListComp(SqList A,SqList B)//比较字符表 A 和 B,并用返回值表示结果,
值为正,表示 A>B;值为负,表示 A<B;值为零,表示 A=B
{
for(i=1;A.elem[i]||B.elem[i];i++)
if(A.elem[i]!=B.elem[i]) return A.elem[i]-B.elem[i];
return 0;
}//ListComp
2.13 试写一算法在带头结点的单链表上实现线性表操作 LOCATE(L,X)。
Listnode *LocateNode(Linklist head,DataType key)
{
ListNode *p=head->next;
While(p&&p->data!=key)
p=p->next;
return p;
}
2.14 试写一算法在带头结点的单链表结构上实现线性表操作规程 LENGTH(L)。
#include"stdio.h"
#define Maxsize 20
typedef int elemtype;
typedef struct node{
elemtype data;
struct node *next;
}lnode;
typedef lnode * linklist;
int length_list(linklist head)
{lnode *p=head; int j=0;
3
if(!p){ printf("error");exit(0);}
while(p->next)
{p=p->next;j++;}
return j;
}
2.15 已知 L1 和 L2 分别指向两个单链表的头结点,且已知其长度分别为 m 和 n。
试写一算法将这两个链表连接在一起,请分析你的算法的时间复杂度。
解:
分析:
由于要进行的是两单链表的连接,所以应找到放在前面的那张表的表尾结
点,再将后表的开始结点链接到前表的终端结点后即可。该算法的主要时间消耗
是用在寻找第一张表的终端尾结点上。这两张单链表的连接顺序无要求,并且已
知两表的表长,则为了提高算法效率,可选表长小的单链表在前的方式连接。
具体算法如下:
LinkList Link( LinkList L1 , LinkList L2,int m,int n )
{//将两个单链表连接在一起
ListNode *p , *q, *s ;
//s 指向短表的头结点,q 指向长表的开始结点,回收长表头结点空间
if (m<=n)
{s=L1;q=L2->next;free(L2);}
else {s=L2;q=L1->next;free(L1);}
p=s;
while ( p->next ) p=p->next; //查找短表终端结点
p->next = q; //将长表的开始结点链接在短表终端结点后
return s;
}
本算法的主要操作时间花费在查找短表的终端结点上,所以本算的法时间复
4
杂度为:
O(min(m,n))
2.16 见书后答案.
2.17 Status Insert(LinkList &L,int i,int b)//在无头结点链表 L 的第 i 个元素之前插
入元素 b
{
p=L;q=(LinkList*)malloc(sizeof(LNode));
q.data=b;
if(i==1)
{
q.next=p;L=q; //插入在链表头部
}
else
{
while(--i>1) p=p->next;
q->next=p->next;p->next=q; //插入在第 i 个元素的位置
}
}//Insert
2.18 Status Delete(LinkList &L,int i)//在无头结点链表 L 中删除第 i 个元素
{
if(i==1) L=L->next; //删除第一个元素
else
{
p=L;
while(--i>1) p=p->next;
p->next=p->next->next; //删除第 i 个元素
}
}//Delete
5
剩余29页未读,继续阅读
资源评论
不吃鸳鸯锅
- 粉丝: 8325
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功