s+=B[i][j];
sum=s;
解:
O(n2)
(3)T=A;
A=B;
B=T;
解:
O
(1)
(4)s1(intn)
{intp=1,s=0;
for(i=1;i<=n;i++)
{p*=i;s+=p;}
return(s);
}
O(n)
(5)s2(intn)
x=0;
y=0;
for(k=1;k<=n;k++)
x++;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
y++;
解:
O(n2)
五.根据二元组关系,画出对应逻辑图形的草图,指出它们属于何种数据结构。
1.A=(D,R),其中:
D={a,b,c,d,e},
R={}
解:
ab
cde
属于集合
2.B=(D,R),其中:
D={a,b,c,d,e,f},R={r}
R={,,,,}(尖括号表示结点之间关系是有向的)
解:
属于线性结构。
3.根据二元组关系画出逻辑图形,并指出它们属于何种数据结构。
F=(D,R),其中:
D={50,25,64,57,82,36,75,55},
R={<50,25>,<50,64>,<25,36>,<64,57>,
<64,82>,<57,55>,<57,75>}
解:
属于树结构
4
.根据二元组关系画出逻辑图形,并指出它们属于何种数据结构。
C=(D,R),其中:
D={1,2,3,4,5,6},
R={(1,2),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6)}
(园括号表示结点之间关系是有向的)
解:
属于图结构
5.根据二元组关系画出逻辑图形,并指出它们属于何种数据结构。
E=(D,R),其中:
D={a,b,c,d,e,f,g,h},
R={,,,,,,}
解:
属于树结构。
模拟考题
1.根据二元组关系画出逻辑图形,并指出它们属于何种数据结构。
A=(D,R),其中:
D={1,2,3,4,5,6},
R={(1,2),(1,6),(2,3),(2,4),
(3,4),(3,5),(3,6),(4,5),(5,6)}
解:
属于图结构
2
.根据二元组关系画出逻辑图形,并指出它们属于何种数据结构。
B=(D,R),其中:
D={40,30,20,60,50,80,70,10},
R={<30,20>,<30,60>,<20,40>,<60,50>,
<60,70>,<60,80>,<70,10>}
解:
属于树结构
3
.根据二元组关系画出逻辑图形,并指出它们属于何种数据结构。
C=(D,R),其中:
D={1,2,3,4,5,6},
R={(1,2),(2,3),(2,4),(3,4),
(3,5),(3,6),(4,5),(4,6)}
解:
属于图结构
4.根据二元组关系画出逻辑图形,并指出它们属于何种数据结构。
E=(D,R),其中:
D={a,b,c,d,e,f,g,h},
R={,,,,
,,}
解:
属于树结构
单元练习2
一.判断题(下列各题,正确的请在前面的括号内打√;错误的打╳)
(×)
(1)线性表的链式存储结构优于顺序存储。
(×)
(2)链表的每个结点都恰好包含一个指针域。
(√)(3)在线性表的链式存储结构中,逻辑上相邻的两个元素在物理位置上并不一定紧邻。
(×)(4)顺序存储方式的优点是存储密度大,插入、删除效率高。
(×)(5)线性链表的删除算法简单,因为当删除链中某个结点后,计算机会自动地将后续的各个单元向前移动。
(×)(6)顺序表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。
(√)(7)线性表链式存储的特点是可以用一组任意的存储单元存储表中的数据元素。
(√)(8)线性表采用顺序存储,必须占用一片连续的存储单元。
(×)(9)顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。
(ㄨ)(10)插入和删除操作是数据结构中最基本的两种操作,所以这两种操作在数组中也经常使用。
二.填空题
(1)顺序表中逻辑上相邻的元素在物理位置上必须相连。
(2)线性表中结点的集合是有限的,结点间的关系是一对一关系。
(3)顺序表相对于链表的优点是:
节省存储和随机存取。
(4)链表相对于顺序表的优点是:
插入、删除方便。
(5)采用顺序存储结构的线性表叫顺序表。
(6)顺序表中访问任意一个结点的时间复杂度均为O
(1)。
(7)链表相对于顺序表的优点是插入、删除方便;缺点是存储密度小。
(8)在双链表中要删除已知结点*P,其时间复杂度为O
(1)。
(9)在单链表中要在已知结点*P之前插入一个新结点,需找到*P的直接前趋结点的地址,其查找的时间复杂度为O(n)。
(10)单链表中需知道头指针才能遍历整个链表。
(11)性表中第一个结点没有直接前趋,称为开始结点。
(12)在一个长度为n的顺序表中删除第i个元素,要移动n-i个元素。
(13)在一个长度为n的顺序表中,如果要在第i个元素前插入一个元素,要后移n-i+1个元素。
(14)在无头结点的单链表中,第一个结点的地址存放在头指针中,而其它结点的存储地址存放在前趋结点的指针域中。
(15)当线性表的元素总数基本稳定,且很少进行插入和删除操作,但要求以最快速度存取线性表中的元素时,应采用顺序存储结构。
(16)在线性表的链式存储中,元素之间的逻辑关系是通过指针决定的。
(17)在双向链表中,每个结点都有两个指针域,它们一个指向其前趋结点,另一个指向其后继结点。
(18)对一个需要经常进行插入和删除操作的线性表,采用链式存储结构为宜。
(19)双链表中,设p是指向其中待删除的结点,则需要执行的操作为:
p->prior->next=p->next。
(20)在如图所示的链表中,若在指针P所在的结点之后插入数据域值为a和b的两个结点,则可用下列两个语句:
S->next->next=P->next;和P->next=S;来实现该操作。
P
Λ
a
b
S
三.选择题
(1)在具有n个结点的单链表中,实现(A)的操作,其算法的时间复杂度都是O(n)。
A.遍历链表或求链表的第i个结点B.在地址为P的结点之后插入一个结点
C.删除开始结点D.删除地址为P的结点的后继结点
(2)设a、b、c为三个结点,p、10、20分别代表它们的地址,则如下的存储结构称为(B)。
A.循环链表B.单链表C.双向循环链表D.双向链表
(3)单链表的存储密度(C)。
A.大于1B.等于1C.小于1D.不能确定
(4)已知一个顺序存储的线性表,设每个结点占m个存储单元,若第一个结点的地址为B,则第i个结点的地址为(A)。
A.B+(i-1)*mB.B+i*mC.B-i*mD.B+(i+1)*m
(5)在有n个结点的顺序表上做插入、删除结点运算的时间复杂度为(B)。
A.O
(1)B.O(n)C.O(n2)D.O(log2n)
(6)设Llink、Rlink分别为循环双链表结点的左指针和右指针,则指针P所指的元素是双循环链表L的尾元素的条件是(D)。
A.P==LB.P->Llink==LC.P==NULLD.P->Rlink==L
(7)两个指针P和Q,分别指向单链表的两个元素,P所指元素是Q所指元素前驱的条件是(B)。
A.P->next==Q->nextB.P->next==QC.Q->next==PD.P==Q
(8)用链表存储的线性表,其优点是(C)。
A.便于随机存取B.花费的存储空间比顺序表少
C.便于插入和删除D.数据元素的物理顺序与逻辑顺序相同
(9)在单链表中,增加头结点的目的是(C)。
A.使单链表至少有一个结点B.标志表中首结点的位置
C.方便运算的实现D.说明该单链表是线性表的链式存储结构
(10)下面关于线性表的叙述中,错误的是(D)关系。
A.顺序表必须占一片地址连续的存储单元B.顺序表可以随机存取任一元素
C.链表不必占用一片地址连续的存储单元D.链表可以随机存取任一元素
(11)L是线性表,已知LengthList(L)的值是5,经DelList(L,2)运算后,LengthList(L)的值是(C)。
A.2B.3C.4D.5
(12)单链表的示意图如下:
L
A
B
C
D
Λ
Q
R
P
指向链表Q结点的前趋的指针是(B)。
A.LB.PC.QD.R
(13)设p为指向单循环链表上某结点的指针,则*p的直接前驱(C)。
A.找不到B.查找时间复杂度为O
(1)
C.查找时间复杂度为O(n)D.查找结点的次数约为n
(14)等概率情况下,在有n个结点的顺序表上做插入结点运算,需平均移动结点的数目为(C)。
A.nB.(n-1)/2C.n/2D.(n+1)/2
(15)在下列链表中不能从当前结点出发访问到其余各结点的是(C)。
A.双向链表B.单循环链表C.单链表D.双向循环链表
(16)在顺序表中,只要知道(D),就可以求出任一结点的存储地址。
A.基地址B.结点大小C.向量大小D.基地址和结点大小
(17)在双链表中做插入运算的时间复杂度为(A)。
A.O
(1)B.O(n)C.O(n2)D.O(log2n)
(18)链表不具备的特点是(A)。
A.随机访问B.不必事先估计存储空间
C.插入删除时不需移动元素D.所需空间与线性表成正比
(19)以下关于线性表的论述,不正确的为(C)。
A.线性表中的元素可以是数字、字符、记录等不同类型
B.线性顺序表中包含的元素个数不是任意的
C.线性表中的每个结点都有且仅有一个直接前趋和一个直接后继
D.存在这样的线性表,即表中没有任何结点
(20)在(B)的运算中,使用顺序表比链表好。
A.插入B.根据序号查找C.删除D.根据元素查找
四.程序填空
1.已知线性表中的元素是无序的,并以带表头结点的单链表作存储。
试写一算法,删除表中所有大于min,小于max的元素,试完成下列程序填空。
Voiddelete(lklisthead;datatypemin,max)
{q=head->next;
while(p!
=NULL)
{if((p->data<=min)||(p->data>=max)
{q=p;p=p->next;}
else
{q->next=p->next;
delete(p);
p=q->next;}
}
}
2.在带头结点head的单链表的结点a之后插入新元素x,试完成下列程序填空。
structnode
{elemtypedata;
node*next;
};
voidlkinsert(node*head,elemtypex)
{node*s,*p;
s=newnode;
s->data=x;
p=head->next;
while(p!
=NULL)&&(p->data!
=a)
____p=p->next;
if(p==NULL)
cout<<"不存在结点a!
";
else{_____s->next=p->next______;
___p->next=s__________;
}
}
模拟考题
1.在顺序存储的线性表第i个位置插入新结点x,试完成下列程序填空。
typedefstruct//将data和last封装在一个结构体
{datatypedata[MAXLEN];//MAXLEN为线性表的最大长度
intlast;
}SeqList;
intInsList(SeqList*L,inti,datatypex)//插入结点函数
{intj;
if(L->last==MAXLEN-1)
{cout<<"顺序表已满!
";return(-1);}
if(i<1||i>L->last+2)//检查插入位置的正确性
{cout<<"位置出错!
";return(0);}
for(j=L->last;j>=i-1;j--)//结点移动
L->data[j+1]=L->data[j];
L->Lata[i-1]=x;//新结点插入
L->last++;(或L->last=L->last+1)
return
(1);
}
2.一个带头指针的单链表,写出在值为x的结点之后插入m个结点的算法。
voidinsertm(lklisthead;intm)
{p=head->next;
while(p!
=NULL)&&(p->data!
=x)
p=p->next;
if(p->data==x)
{q=p->next;
for(i=0;i{s=new(node);
cin<s->data=a;
p->next=s;
p=s;}
p->next=q;
}
}
3.有两个循环单链表,头指针分别为head1和head2,下列函数是将链表head1链接到链表head2,链接后的链表仍然是循环链表,试完成下列程序填空。
(提示:
先找到两链表的尾指针,再将第一个链表的尾指针与第二个链表的头结点链接起来)
node*link(node*head1,node*head2)
{node*p,*q;
p=head1;
while(p->next!
=head1)
p=p->next;
q=head2;
while(q->next!
=head2)
q=q->next;
p->next=head2;
q->next=head1;
return(head1);
}
单元练习3
一.判断题(下列各题,正确的请在前面的括号内打√;错误的打╳)
(√)
(1)栈是运算受限制的线性表。
(√)
(2)在栈空的情况下,不能作出栈操作,否则产生下溢出。
(ㄨ)(3)栈一定是顺序存储的线性结构。
(√)(4)栈的特点是“后进先出”。
(ㄨ)(5)空栈就是所有元素都为0的栈。
(ㄨ)(6)在C或C++语言中设顺序栈的长度为MAXLEN,则top=MAXLEN时表示队满。
(√)(7)链栈与顺序栈相比,其特点之一是通常不会出现栈满的情况。
(ㄨ)(8)一个栈的输入序列为:
A,B,C,D,可以得到输出序列:
C,A,B,D。
(ㄨ)(9)递归定义就是循环定义。
(√)(10)将十进制数转换为二进制数是栈的典型应用之一。
二.填空题
(1)在栈结构中,允许插入、删除的一端称为栈顶。
(2)在顺序栈中,当栈顶指针top=-1时,表示栈空。
(3)在有n个元素的栈中,进栈操作的时间复杂度为O
(1)。
(4)在栈中,出栈操作的时间复杂度为:
O
(1)。
(5)已知表达式,求它的后缀表达式是栈的典型应用。
(6)在一个链栈中,若栈顶指针等于NULL,则表示栈空。
(7)向一个栈顶指针为top的链栈插入一个新结点*p时,应执行p->next=top;和top=p;操