数据结构考试归纳

第一章 绪论

编程题

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

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值