数据结构第二章线性表作业习题及答案——北理工版
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二章(线性表)作业(参见《数据结构题集》第2章部分P13)
一、在什么情况下用顺序表比链表好?(题集2.3)
二、单选题:
1、线性表的顺序存储是通过何种方式表示元素之间的逻辑关系。
①后继元素的地址②元素的存储顺序
③左右孩子地址④后继元素的数组下标
2、在线性表顺序存储结构中,在第I个元素之前插入新元素一般需要。
①移动元素②修改头指针
③修改指针④申请新的结点空间
3、在长度为n的顺序表的第I个元素之前插入一新元素的算法的时间复杂度为。
①O(n) ②O(1)
③O(n2) ④O(Log2n)
三、编写顺序表的判空操作算法。
四、编写顺序表求表长操作的算法。
五、已知L是带表头结点的非空单链表,且P结点既不是首元结点,也不是尾元结点,试从下列(1) ~ (14)提供的答案中选择合适的语句序列填空。
(题集2.7)
a.删除P结点的直接后继结点的语句序列是_______ __________。
b.删除P结点的直接前驱结点的语句序列是_______________ __。
c.删除P结点的语句序列是_____________________________ _ _。
d.删除首元结点的语句序列是___________________________ __。
e.删除尾元结点的语句序列是____ _________________________。
(1)p = p->next;
(2)p->next = p;
(3)p->next = p->next->next;
(4)p = p->next->next;
(5)while ( p!=NULL ) p=p->next;
(6)while ( q->next!=NULL ) { p=q; q=q->next; }
(7)while ( p->next!=q ) p=p->next;
(8)while ( p->next->next!=q ) p=p->next;
(9)while ( p->next->next!=NULL ) p=p->next;
(10)q=p;
(11)q=p->next;
(12)p=l;
(13)l=l->next;
(14)free(q);
六、算法设计。
设顺序表va中的数据元素递增有序,请设计一算法,将x插入到顺序表的适当位置,以保持该表的有序性。
(题集2.11)
七、算法设计。
请设计一个算法,实现顺序表的原地逆置,即利用原表的存储空间将线性表(a1,a2,……,an)逆置为(an,……,a2,a1)。
(题集2.21)
八、算法设计。
请设计一个算法,实现单链表的原地逆置。
参考答案:
一、当线性表的数据元素在物理位置上是连续存储的时候,用顺序表比用链表好,其特点是可以进行随机存取。
二、②①①
三、Status EmptyListSeq(SeqListTp L)
{ if (L.length==0) return TRUE ; else return FALSE ; }
四、int LengthListSeq(SeqListTp L)
{return L.length; }
五、a:11,3,14 b:10,12,8,3,14
c:10,12,7,3,14 d:12,11,3,14
e:9,11,3,14
六、Status InsertOrderList(SqList &va,ElemType x)
{
//在非递减的顺序表va 中插入元素x 并使其仍成为顺序表的算法
int i;
if(va.length==va.listsize)return(OVERFLOW);
for(i=va.length;i>0,x<va.elem[i-1];i--)
va.elem[i]=va.elem[i-1];
va.elem[i]=x;
va.length++;
return OK;
}
七、Status ListOppose_Sq(SqList &L)
{
int i;
ElemType x;
for(i=0;i<L.length/2;i++){
x=L.elem[i];
L.elem[i]=L.elem[L.length-1-i]; L.elem[L.length-1-i]=x;
}
return OK;
}
八、#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef char ElemType; typedef struct Node
{
ElemType data;
struct Node * next;
}Node, *LinkList;
void CreateFromTail(LinkList L) {
Node *r, *s;
char c;
int flag =1;
while(flag)
{
c=getchar();
if(c!='$')
{
s=(Node*)malloc(sizeof(Node)); s->data=c;
r->next=s;
r=s;
}
else
{
flag=0;
r->next=NULL;
}
}
}
void ReverseList(LinkList L) {
Node *p,*q;
p=L->next;
L->next=NULL;
while(p!=NULL)
{
q=p->next;
p->next=L->next;
L->next=p;
}
}
void main()
{
LinkList l;
Node *p;
l=(Node * )malloc(sizeof(Node));
l->next = NULL;
printf("用尾插法建立单链表,请输入链表数据,以$结束!\n"); CreateFromTail(l);
printf("输入的单链表为:\n");
p = l->next;
while(p!=NULL)
{
printf("%c\n",p->data);
p=p->next;
}
ReverseList(l);
printf("逆置后的单链表为:\n");
p = l->next;
while(p!=NULL)
{
printf("%c\n",p->data);
p=p->next;
}
}。