1.2第一章作业2--链式存储结构及其操作--1
2-1
线性表若采用链式存储结构时,要求内存中可用存储单元的地址
(1分)
A.
必须是连续的
B.
连续或不连续都可以
C.
部分地址必须是连续的
D.
一定是不连续的
作者
DS课程组
单位
浙江大学
2-2
线性表L在什么情况下适用于使用链式结构实现?
(1分)
A.
需不断对L进行删除插入
B.
需经常修改L中的结点值
C.
L中含有大量的结点
D.
L中结点结构复杂
作者
DS课程组
单位
浙江大学
2-3
链表不具有的特点是:
(1分)
A.
插入、删除不需要移动元素
B.
方便随机访问任一元素
C.
不必事先估计存储空间
D.
所需空间与线性长度成正比
作者
DS课程组
单位
浙江大学
2-4
设h为不带头结点的单向链表。在h的头上插入一个新结点t的语句是:
(1分)
A.
h=t; t->next=h->next;
B.
t->next=h->next; h=t;
C.
h=t; t->next=h;
D.
t->next=h; h=t;
作者
DS课程组
单位
浙江大学
2-5
在单链表中,若p所指的结点不是最后结点,在p之后插入s所指结点,则执行
(1分)
A.
s->next=p; p->next=s;
B.
s->next=p->next; p=s;
C.
s->next=p->next; p->next=s;
D.
p->next=s; s->next=p;
作者
DS课程组
单位
浙江大学
2-6
不带表头附加结点的单链表为空的判断条件是头指针head满足条件()。
(1分)
A.
head==NULL
B.
head->next==NULL
C.
head->next== head
D.
head!=NULL
作者
严冰
单位
浙江大学城市学院
2-7
可以用带表头附加结点的链表表示线性表,也可以用不带头结点的链表表示线性表,前者最主要的好处是()。
(1分)
A.
可以加快对表的遍历
B.
使空表和非空表的处理统一
C.
节省存储空间
D.
可以提高存取表元素的速度
作者
严冰
单位
浙江大学城市学院
2-8
在单链表中,要删除某一指定结点,必须先找到该结点的()。
(1分)
A.
直接前驱
B.
自身位置
C.
直接后继
D.
直接后继的后继
作者
严冰
单位
浙江大学城市学院
2-9
以下关于链式存储结构的叙述中,()是不正确的。
(1分)
A.
结点除自身信息外还包括指针域,因此存储密度小于顺序存储结构
B.
逻辑上相邻的结点物理上不必邻接
C.
可以通过计算直接确定第i个结点的存储地址
D.
插入、删除运算操作方便,不必移动结点
作者
严冰
单位
浙江大学城市学院
2-11
线性表采用链式存储时,其地址()。
(1分)
A.
必须是连续的
B.
一定是不连续的
C.
部分地址必须是连续的
D.
连续与否均可以
6-1 循环单链表区间删除 (15分)
本题要求实现带头结点的循环单链表的创建和单链表的区间删除。L是一个带头结点的循环单链表,函数ListCreate_CL用于创建一个循环单链表,函数ListDelete_CL用于删除取值大于min小于max的链表元素。
函数接口定义:
Status ListCreate_CL(LinkList &CL);
void ListDelete_CL(LinkList &CL,ElemType min,ElemType max);
裁判测试程序样例:
```
//库函数头文件包含
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//函数状态码定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType; //假设线性表中的元素均为整型
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList; //循环单链表类型定义与单链表定义相同,区别在尾节点next取值
Status ListCreate_CL(LinkList &CL);
void ListDelete_CL(LinkList &CL, ElemType min, ElemType max);
void ListPrint_CL(LinkList &CL)
{ //输出单链表,空表时输出Empty List。
LNode *p=CL->next; //p指向第一个元素结点
if(p==CL){
printf("Empty List");
return;
}
while(p!=CL)
{
if(p->next!=CL)
printf("%d ",p->data);
else
printf("%d",p->data);
p=p->next;
}
}
int main()
{
LinkList CL;
ElemType min,max;
if(ListCreate_CL(CL)!= OK)
{
printf("循环链表创建失败!!!\n");
return -1;
}
scanf("%d%d",&min,&max);
ListDelete_CL(CL,min,max);
ListPrint_CL(CL);
return 0;
}
/* 请在这里填写答案 */
```
输入格式: 第一行输入一个整数n,表示循环单链表中元素个数,接下来一行共n个整数,中间用空格隔开。第三行输入min和max。
输出格式: 输出删除后循环链表的各个元素,两个元素之间用空格隔开,最后一个元素后面没有空格。
输入样例:
6
1 2 3 4 5 6
2 5
输出样例:
1 2 5 6
6-2 单链表元素定位 (12分)
本题要求在链表中查找第一个数据域取值为x的节点,返回节点的位序。L是一个带头结点的单链表,函数ListLocate_L(LinkList L, ElemType x)要求在链表中查找第一个数据域取值为x的节点,返回其位序(从1开始),查找不到则返回0。例如,原单链表各个元素节点的元素依次为1,2,3,4,则ListLocate_L(L, 1)返回1,ListLocate_L(L, 3)返回3,而ListLocate_L(L, 100)返回0。
函数接口定义:
int ListLocate_L(LinkList L, ElemType x);
其中 L 是一个带头节点的单链表。 x 是一个给定的值。函数须在链表中查找第一个数据域取值为x的节点。若找到则返回其位序(从1开始),找不到则返回0。
裁判测试程序样例:
```
//库函数头文件包含
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//函数状态码定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType; //假设线性表中的元素均为整型
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
Status ListCreate_L(LinkList &L,int n)
{
LNode *rearPtr,*curPtr; //一个尾指针,一个指向新节点的指针
L=(LNode*)malloc(sizeof (LNode));
if(!L)exit(OVERFLOW);
L->next=NULL; //先建立一个带头结点的单链表
rearPtr=L; //初始时头结点为尾节点,rearPtr指向尾巴节点
for (int i=1;i<=n;i++){ //每次循环都开辟一个新节点,并把新节点拼到尾节点后
curPtr=(LNode*)malloc(sizeof(LNode));//生成新结点
if(!curPtr)exit(OVERFLOW);
scanf("%d",&curPtr->data);//输入元素值
curPtr->next=NULL; //最后一个节点的next赋空
rearPtr->next=curPtr;
rearPtr=curPtr;
}
return OK;
}
//下面是需要实现的函数的声明
int ListLocate_L(LinkList L, ElemType x);
int main()
{
LinkList L;
int n;
int x,k;
scanf("%d",&n); //输入链表中元素个数
if(ListCreate_L(L,n)!= OK) {
printf("表创建失败!!!\n");
return -1;
}
scanf("%d",&x); //输入待查找元素
k=ListLocate_L(L,x);
printf("%d\n",k);
return 0;
}
/* 请在这里填写答案 */
```
输入样例:
4
1 2 3 4
1
输出样例:
1
浙公网安备 33010602011771号