广工新Anyview数据结构第一章解答

DC01PE06

【题目】试写一算法,如果三个整数a,b和c的值不是依次非递增的,则通过交换,令其为非递增。

要求实现下列函数:
void Descend(int &a, int &b, int &c); 
/* 通过交换,令 a >= b >= c */

void Descend(int &a, int &b, int &c) { // 通过交换,令 a >= b >= c
    int temp;
    if(a<b){
        temp=a;a=b;b=temp;
    }
    if(a<c){    
        temp=a;a=c;c=temp;
    }
    if(b<c){
        temp=b;b=c;c=temp;
    }

}

DC01PE08

【题目】试编写算法求一元多项式P(x) = a0 + a1x + a2x^2 + ... + anx^n的值P(x0),并确定算法中每一语句的执行次数和整个算法的时间复杂度。

要求实现下列函数:
float Polynomial(int n, int a[], float x0);
/* 求一元多项式的值P(x0)。                    */
/* 数组a的元素a[i]为i次项的系数,i=0,1,...,n  */

float Polynomial(int n, int a[], float x){ 
    // Add your code here
    int k;  //倒着计算,k为多项式各次项的幂
    float p = 0;   //p为多项式各项的值
    float sum = 0;  //sum为多项式的值
    for(k = n;k >= 0;k--){  //幂从n依次减小到0
         p = a[k]*pow(x,k);
         sum = sum + p;
    }
    return sum;

}

DC01PE11 

【题目】已知k阶裴波那契序列的定义为

  f(0)=0, f(1)=0, ..., f(k-2)=0, f(k-1)=1;f(n)=f(n-1)+f(n-2)+...+f(n-k), n=k,k+1,...
试编写求k阶裴波那契序列的第m项值的函数算法,k和m均以值调用的形式在函数参数表中出现。

要求实现下列函数:
Status Fibonacci(int k, int m, int &f);
/* 如果能求得k阶斐波那契序列的第m项的值f,则返回OK;*/
/* 否则(比如,参数k和m不合理)返回ERROR            */

Status Fibonacci(int k, int m, int &f) { 
	  int t[50],i,j,sum;
    if(k <= 1 || m < 0) //错误的序列或错误的项数
        return ERROR;
        
    //接下来,将序列复制到数组t中    
    for(i = 0;i <= k-2;i++)
        t[i]=0;  //前k-2项全为0
        
    t[k-1]=1; //f(k-1)=1
    
    for(i = k;i <= m;i++){ //从k到m项将序列各项计算并复制到数组t中
        sum = 0;   //每次循环前要把中间变量sum置0
        for(j = i - k;j < i;j++)  //第n项等于第n项的前k项和
            sum += t[j];  //计算i的前k项和
        t[i]=sum;
    }
    f=t[m]; //求得第m项的值f由引用参数返回   
    return OK;        
}

DC01PE18

【题目】试编写算法,计算i!×2^i的值并存入数组a[0..n-1]的第i-1个分量中 (i=1,2,…,n)。假设计算机中允许的整数最大值为MAXINT,则当对某个k(1≤k≤n)使k!×2^k>MAXINT时,应按出错处理。注意选择你认为较好的出错处理方法。
要求实现下列函数:
Status Series(int a[], int n);
/* 求i!*2^i序列的值并依次存入长度为n的数组a;若所有 */
/* 值均不超过MAXINT,则返回OK,否则返回EOVERFLOW     */

Status Series(int a[], int n) {
    int sum=0,m=1,k=2,i=1;
    if(n <= 0) return ERROR;
    for(i;i <= n;i++) {
        sum = m*k; //各项的值
        //改变因数m、n的值以完成下一次sum
        m *= (i+1); //m每次乘(i+1),递增这个因数即实现i的阶乘运算
        k *= 2;//k每次乘2,递增这个因数即实现2的平方运算
        a[i-1] = sum;//将sum存入数组a
        if(a[i-1] > MAXINT) //超过允许的整数最大值
            return EOVERFLOW;
    }
    return OK;
}

DC01PE49

【题目】试写一算法,由长度为n的一维数组a构建一个序列S。

要求实现下列函数:
Status CreateSequence(Sequence &S, int n, ElemType *a); 
/* 由长度为n的一维数组a构建一个序列S,并返回OK。 */
/* 若构建失败,则返回ERROR                       */

序列的定义为:
typedef struct {
  ElemType  *elem;
  int  length;
} Sequence;

Status CreateSequence(Sequence &S, int n, ElemType *a) { 
    if (NULL == a || n <= 0)
        return ERROR;
    S.length = n;
    S.elem = (ElemType*)malloc(n*sizeof(ElemType));
    int i;
    ElemType  *p;
    p=S.elem;
    for (i = 0;p < S.elem+n;p++,i++){
        *p=a[i];
    }
    return OK;   

}

DC01PE61

【题目】链表的结点和指针类型定义如下
    typedef struct LNode {
       ElemType  data;
       struct LNode *next;
    } LNode, *LinkList;
试写一函数,构建一个值为x的结点。
要求实现下列函数:
LinkList MakeNode(ElemType x); 
/* 构建一个值为x的结点,并返回其指针。 */
/* 若构建失败,则返回NULL。            */

LinkList MakeNode(ElemType x) { 
    LNode *p;
    p = (LNode*)malloc(sizeof(LNode));
    if(NULL == p)
        return ERROR;//构建失败返回NULL
    p->data = x;
    p->next = NULL;
    return p;//构建成功返回其指针
}

DC01PE63

【题目】链表的结点和指针类型定义如下

    typedef struct LNode {
       ElemType  data;
       struct LNode *next;
    } LNode, *LinkList;
试写一函数,构建长度为2且两个结点的值依次为x和y的链表。

要求实现下列函数:
LinkList CreateLinkList(ElemType x, ElemType y); 
/* 构建其两个结点的值依次为x和y的链表。*/
/* 若构建失败,则返回NULL。            */
 

LinkList CreateLinkList(ElemType x, ElemType y) { 
    LNode *p,*q;
    p = (LNode *)malloc(sizeof(LNode));
    q = (LNode *)malloc(sizeof(LNode));
    p->data = x;
    p->next = q;
    q->data = y;
    q->next = NULL;
    return p;
}

DC01PE65

【题目】链表的结点和指针类型定义如下

    typedef struct LNode {
       ElemType  data;
       struct LNode *next;
    } LNode, *LinkList;
试写一函数,构建长度为2的升序链表,两个结点的值分别为x和y,但应小的在前,大的在后。

要求实现下列函数:
LinkList CreateOrdLList(ElemType x, ElemType y); 
/* 构建长度为2的升序链表。    */
/* 若构建失败,则返回NULL。   */

LinkList CreateOrdLList(ElemType x, ElemType y) { 
    LNode *p,*q;
    p = (LNode *)malloc(sizeof(LNode));
    q = (LNode *)malloc(sizeof(LNode));
    (x<y)?(p->data = x,q->data = y):(p->data = y,q->data = x);//小的在前,大的在后
    p->next = q;
    q->next = NULL;
    return p;
}

猜你喜欢

转载自blog.csdn.net/weixin_46265255/article/details/108721600