第一章 绪论
编程题
1.编写一个求已经两个复数除法运算的算法函数。
算法函数的接口定义为:void Division(Complex z1,Complex z2, Complex &div);
其中复数类型定义为:
typedef struct{
float real; //实部
float imag; //虚部
} Complex;
答:
void Division(Complex z1,Complex z2, Complex &Div){
Div.real=(z1.real*z2.real+z1.imag*z2.imag)/(z2.real*z2.real+z2.imag*z2.imag);
Div.imag=(z1.imag*z2.real-z1.real*z2.imag)/(z2.real*z2.real+z2.imag*z2.imag);
}
选择题
2.数据结构课程讨论的内容就是非数值计算问题的数学模型及其它们的( C )在计算机中的表示和实现。
A结构 B关系 C运算(操作) D算法
3.抽象数据类型是指一个数学模型及定义在该模型上的一组( B )。
A数据对象 B运算(操作) C关系 D结构
4.一个算法应该是( B )。
A程序 B待定问题求解步骤的描述 C要满足五个基本特征 D.A和C
填空题
第二章 线性表
编程题
1.编写一个算法reverse(LinkList &L) ,实现对带头结点的单链表L进行就地逆置的操作。
答:Status reverse(LinkList &L) { //实现对带头结点的单链表L就地逆置(采用的是头插法)
p =L->next;
L->next=NULL; //形成一个空的链表
while (p != NULL) {
q =p->next; //用q记下p的后继结点
p->next=L->next; //将p结点依次插入到链表的头部
L->next=p;
p = q; //用p指向q所指的结点
}
return OK;
}
2.编写算法:Status Insert(SqList &L,int x),实现在非递减有序顺序表L中插入一个值为x的新元素,并使顺序表L仍然保持有序。
答:①Status Insert(SqList &L, ElemType x){
if(L.length>=L.listsize) //顺序表空间满时,则退出
return ERROR;
for(i=0; i<L.length && L.elem[i]<x;i++); //确定插入位置
for(j=L.length-1;j>=i; i--) //将第i个元素及其之后的所有元素后移一位
L.elem[j+1]=L.elem[j];
L.elem[i]=x; //插入x
L.length++; //表长加1
return OK;
}
②【参考答案二】//将x插入非递减有序表L中(方法二)
Status Insert(SqList &L, ElemType x){ //顺序表空间满时,则退出
if(L.length>=L.listsize)
return ERROR;
for(i=L.length-1; i>=0 && L.elem[i]>x;i--)
L.elem[i+1]=L.elem[i]; //一边比较,一边进行后移
L.elem[i+1]=x; //插入x
L.length++; //表长加1
return OK;
}
3.编写算法int Length(LinkList L), 实现在带头结点的单链表结构上求线性表的长度操作,返回值为表的长度。
//后面所有题中的单链表的类型都描述如下:
typedef struct LNode {
ElemType data; // 数据域
struct LNode *next; // 指针域
} LNode, *LinkList;
答:int Length(LinkList L)
//求带头结点的单链表L的长度
{ int k;
LinkList p;
k=0;
p=L->next;
while (p)
{ k++;
p=p->next;
}
return k;
}
4.线性表L={a1,b1,a2,b2,…,an,bn}采用带头结点的单链表表示,设计一个算法Split(LinkList L,LinkList &LA,LinkList &LB),将其拆分成两个表LA和LB,其中LA={a1,a2,…,an},LB={b1,b2,…,bn},并且要求LA和LB采用具有相同结构的链表表示,空间复杂度为O(1)。
答:
Status Split(LinkList L,LinkList &LA,LinkList &LB){
//将带头结点的单链表L分解成两个带头结点的单链表LA和LB,其LA和LB的实参值是两个两头结点的空链表
p=L->next; //p指向链表L的第一个元素结点
ra=LA; //ra、rb分别用来记录链LA和LB的尾结点
rb=LB;
i=1; //记录链表L中的结点序号
while(p!=NULL){
if (i%2!=0){ //奇数号结点插入A的尾部
ra->next=p;
ra=p;
}
else{ //偶数号结点插入B的尾部
rb->next=p;
rb=p;
}
p=p->next; //p移至下一结点
i++; //结点序号值加1
}
ra->next=NULL; //LA,LB尾结点的指针域置为空值
rb->next=NULL;
return OK;
}
5.编写一个算法 reverse(SqList &L) ,实现对顺序表就地逆置的操作。所谓逆置,就是把(a1,a2,…,an)变成(an,an-1,…,a1);所谓就地,就是指逆置后的数据元素仍存储在原来顺序表的存储空间中,即不为逆置后的顺序表另外分配存储空间。
答:Status reverse(SqList &L) {
//实现对顺序表L就地逆置
for (i = 0,j=L.length-1; i < j; i++,j--) {
temp = L.elem[i];
L.elem[i] = L.elem[j];
L.elem[j] = temp;
}
retu