- 7
- 0
- 约1.07万字
- 约 10页
- 2018-05-02 发布于河南
- 举报
数据结构第二章线性表详解
第二章 线性表
一、描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。
并说明头指针和头结点的作用。
答:头指针是一个指针变量,里面存放的是链表中首结点的地址,并以此来标识一个链表。如链表H,链表L等,表示链表中第一个结点的地址存放在H、L中。
头结点是附加在第一个元素结点之前的一个结点,头指针指向头结点。当该链表表示一个非空的线性表时,头结点的指针域指向第一个元素结点,为空表时,该指针域为空。
开始结点指第一个元素结点。
头指针的作用是用来惟一标识一个单链表。
头结点的作用有两个:一是使得对空表和非空表的处理得以统一。二是使得在链表的第一个位置上的操作和在其他位置上的操作一致,无需特殊处理。
二、填空题
1、在顺序表中插入或删除一个元素,需要平均移动(表中一半)元素,具体移动的元素个数与(表长和该元素在表中的位置)有关。
2、顺序表中逻辑上相邻的元素的物理位置(必定)相邻。单链表中逻辑上相邻的元素的物理位置(不一定)相邻。
3、在单链表中,除了首元结点外,任一结点的存储位置由(其直接前驱结点的链域的值)指示。
4、在单链表中设置头结点的作用是(插入和删除元素不必进行特殊处理)。
三、何时选用顺序表、何时选用链表作为线性表的存储结构为宜?答:在实际应用中,应根据具体问题的要求和性质来选择顺序表或链表作为线性表的存储结构,通常有以下几方面的考虑: 1.基于空间的考虑。当要求存储的线性表长度变化不大,易于事先确定其大小时,为了节约存储空间,宜采用顺序表;反之,当线性表长度变化大,难以估计其存储规模时,采用动态链表作为存储结构为好。 2.基于时间的考虑。若线性表的操作主要是进行查找,很少做插入和删除操作时,采用顺序表做存储结构为宜;反之, 若需要对线性表进行频繁地插入或删除等的操作时,宜采用链表做存储结构。并且,若链表的插入和删除主要发生在表的首尾两端,则采用尾指针表示的单循环链表为宜。
十一、设顺序表中的数据元素递增有序,试写一算法,将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 ; i0 L-data[ i-1 ] x ; i--) L-data[ i ]=L-data[ i-1 ] ; // 比较并移动元素 L-data[ i ] =x; L - length++; }
十三、试写一算法在带头结点的单链表上实现线性表操作LOCATE(L,X)。
Listnode *LocateNode(Linklist head,DataType key)
{
ListNode *p=head-next;
While(pp-data!=key)
p=p-next;
return p;
}
十四、试写一算法在带头结点的单链表结构上实现线性表操作规程LENGTH(L)。
#includestdio.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;
if(!p){ printf(error);exit(0);}
while(p-next)
{p=p-next;j++;}
return j;
}
十五、已知L1和L2分别指向两个单链表的头结点,且已知其长度分别为m和n。试写一算法将这两个链表连接在一起,请分析你的算法的时间复杂度。解: 分析: 由于要进行的是两单链表的连接,所以应找到放在前面的那张表的表尾结点,再将后表的开始结点链接到前表的终端结点后即可。该算法的主要时间消耗是用在寻找第一张表的终端尾结点上。这两张单链表的连接顺序无要求,并且已知两表的表长,则为了提高算法效率,可
原创力文档

文档评论(0)