第一章 绪论
1、简述下列概念:数据、数据元素、数据结构、逻辑结构、存储结构、线性结构、非线性结构。
数据:指能够被计算机识别、存储和加工处理的信息载体。
数据元素:就是数据的基本单位,在某些情况下,数据元素也称为元素、结点、顶点、记录。数据元素有时可以由若干数据项组成。
数据结构:指的是数据之间的相互关系,即数据的组织形式。一般包括三个方面的内容:数据的逻辑结构、存储结构和数据的运算。
逻辑结构:指各数据元素之间的逻辑关系。
存储结构:就是数据的逻辑结构用计算机语言的实现。
线性结构:数据逻辑结构中的一类,它的特征是若结构为非空集,则该结构有且只有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前趋和一个直接后继。线性表就是一个典型的线性结构。
非线性结构:数据逻辑结构中的另一大类,它的逻辑特征是一个结点可能有多个直接前趋和直接后继。
2、常用的存储表示方法有哪几种?
顺序存储方法:它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。由此得到的存储表示称为顺序存储结构。
链接存储方法:它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。由此得到的存储表示称为链式存储结构。
索引存储方法:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。
散列存储方法:就是根据结点的关键字直接计算出该结点的存储地址。
3、求解下列算法的时间复杂度
(1) i=1; k=0 while(i<n) { k=k+10*i;i++;} | T(n)=n-1 ∴ T(n)=O(n) 这个函数是按线性阶递增的 |
(2) i=0; k=0; do{ k=k+10*i; i++; }字符串是什么数据结构 while(i<n); | T(n)=n ∴ T(n)=O(n) 这也是线性阶递增的 |
(3) i=1; j=0; while(i+j<=n) { if (i<j)j++; else i++;} | T(n)=n/2 ∴ T(n)=O(n) 虽然时间函数是n/2,但其数量级仍是按线性阶递增的。 |
(4)x=n; // n>1 while (x>=(y+1)*(y+1)) y++; | T(n)=n1/2 ∴ T(n)=O(n1/2) 最坏的情况是y=0,那么循环的次数是n1/2次,这是一个按平方根阶递增的函数。 |
(5) x=91; y=100; while(y>0) if(x>100) {x=x-10;y--;} else x++; | T(n)=O(1) 这个程序看起来有点吓人,总共循环运行了1000次,但是我们看到n没有? 没。这段程序的运行是和n无关的,就算它再循环一万年,我们也不管他,只是一个常数阶的函数。 |
第二章线性表
1、试描述头指针、头结点、开始结点的区别、并说明头指针和头结点的作用。
答:开始结点是指链表中的第一个结点,也就是没有直接前趋的那个结点。
链表的头指针是一指向链表开始结点的指针(没有头结点时),单链表由头指针唯一确定,因此单链表可以用头指针的名字来命名。
头结点是我们人为地在链表的开始结点之前附加的一个结点。有了头结点之后,头指针指向头结点,不论链表否为空,头指针总是非空。而且头指针的设置使得对链表的第一个位置上的操作与在表其他位置上的操作一致(都是在某一结点之后)。
2、何时选用顺序表、何时选用链表作为线性表的存储结构为宜?
答:在实际应用中,应根据具体问题的要求和性质来选择顺序表或链表作为线性表的存储结构,通常有以下几方面的考虑:
1.基于空间的考虑。当要求存储的线性表长度变化不大,易于事先确定其大小时,为了节约
存储空间,宜采用顺序表;反之,当线性表长度变化大,难以估计其存储规模时,采用动态链表作为存储结构为好。
2.基于时间的考虑。若线性表的操作主要是进行查,很少做插入和删除操作时,采用顺序表做存储结构为宜;反之, 若需要对线性表进行频繁地插入或删除等的操作时,宜采用链表做存储结构。并且,若链表的插入和删除主要发生在表的首尾两端,则采用尾指针表示的单循环链表为宜。
3、在顺序表中插入和删除一个结点需平均移动多少个结点?具体的移动次数取决于哪两个因素?
答:在等概率情况下,顺序表中插入一个结点需平均移动n/2个结点。删除一个结点需平均移动(n-1)/2个结点。具体的移动次数取决于顺序表的长度n以及需插入或删除的位置i。i越接近n则所需移动的结点数越少。
4、设顺序表L是一个递增有序表,试写一算法,将x插入L中,并使L仍是一个有序表。
因已知顺序表L是递增有序表,所以只要从头起到第一个比它大(或相等)的结点数据,把
x插入到这个数所在的位置就是了。算法如下:
void InsertIncreaseList( Seqlist *L , Datatype x )
{
int i;
for ( i=0 ; i < L -> length && L->data[ i ] < x ; i++) ; // 查并比较,分号不能少
InsertList ( L ,x , i ); // 调用顺序表插入函数
}
5、设单链表L是一个递减有序表,试写一算法,将x插入其后仍保持L的有序性。
只要从头到第一个比x小(或相等)的结点数据,在这个位置插入就可以了。算法如下:
LinkList InsertDecreaseList( Linklist L, Datatype x )
{
int i;
ListNode *p,*s;
p=L;
//查
while(p->next && p->next->data>x )
p=p->next;
s=(ListNode *)malloc(sizeof(ListNode));
s->data=x;
s->next=p->next;
p->next=s;
return L;
}
6、写一算法将单链表中值重复的结点删除,使所得的结果表中各结点值均不相同。
先取开始结点中的值,将它与其后的所有结点值一一比较,发现相同的就删除掉,然后再取第二结点的值,重复上述过程直到最后一个结点。
void DeleteList(Nodetype *L)
{
Nodetype *p,*q,*s;
if(L->Next==NULL||L->Next==NULL)
{
printf("删除错误\n");exit(0);
}
p=L->Next;
q=p->Next;
while(p->Next!=NULL)
{
while(q)
{
s=q;
if(q->Data==p->Data)
{
s->Next=q->Next;
free(q);
q=s->Next;
}
else
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论