廣工資料結構Anyview(C語言版)第一章答案
- 一、將三個整數按升序重新排列
- 二、求一元多項式的值
- 三、求k階裴波那契序列的第m項的值
- 四、計算i!×2^i的值
- 五、由一維陣列構建一個序列
- 六、構建一個值為x的結點
- 七、構建長度為2且兩個結點的值依次為x和y的連結串列
- 八、構建長度為2的升序連結串列
一、將三個整數按升序重新排列
【題目】試寫一演算法,如果三個整數a,b和c的值不是依次非遞增的,則通過交換,令其為非遞增。
要求實現下列函式:
void Descend(int &a, int &b, int &c);
/* 通過交換,令 a >= b >= c */
#include "allinclude.h" //DO NOT edit this line void Descend(int &a, int &b, int &c) { // 通過交換,令 a >= b >= c // Add your code here int t,max; //先找出abc中的最大值 max = (((a>=b)?a:b)>=c)?((a>=b)?a:b):c; if(max==a){ if(b<c){ t = b; b = c; c = t; } } if(max==b){ if(a>=c){ t = a; a = b; b = t; }else{ t = b; b = c; c = a; a = t; } } if(max==c){ if(b>=a){ t = a; a = c; c = t; }else{ t = c; c = b; b = a; a = t; } } }
二、求一元多項式的值
【題目】試編寫演算法求一元多項式 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 */
#include "allinclude.h" //DO NOT edit this line float Polynomial(int n, int a[], float x0){ // Add your code here float p = 0; float t = x0; if(n) for(int i = 1;i<=n;i++){ p += a[i]*t; t = t*x0; } return a[0]+p; }
三、求k階裴波那契序列的第m項的值
【題目】已知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 */
#include "allinclude.h" //DO NOT edit this line
Status Fibonacci(int k, int m, int &f) {
// Add your code here
int a[100],sum;
//異常處理
if(k < 2||m < 0) return ERROR;
if(m < k-1) f = 0;
else{
if(m == k-1) f = 1;
else{
//前k-1項都為0
for(int i = 0;i < k-1;i++) a[i] = 0;
//第k-1項為1
a[k-1] = 1;
//前k項和為下一項
for(int j = k;j <= m;j++){
sum = 0;
for(int i = j-k;i < j;i++) sum += a[i];
a[j] = sum;
}
f = a[m];
}
}
return OK;
}
四、計算i!×2^i的值
【題目】試編寫演算法,計算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 */
#include "allinclude.h" //DO NOT edit this line
Status Series(int a[], int n) {
// Add your code here
if(n <= 0) return ERROR;
int l,m;
l = 1;
m = 2;
for(int i = 1;i <= n;i++){
l *= i;
a[i-1] = l*m;
m *= 2;
if(l > MAXINT||m > MAXINT||l*m > MAXINT) return EOVERFLOW;
}
return OK;
}
五、由一維陣列構建一個序列
【題目】試寫一演算法,由長度為n的一維陣列a構建一個序列S。
要求實現下列函式:
Status CreateSequence(Sequence &S, int n, ElemType a);
/ 由長度為n的一維陣列a構建一個序列S,並返回OK。 /
/ 若構建失敗,則返回ERROR */
序列的定義為:
typedef struct {
ElemType *elem;
int length;
} Sequence;
#include "allinclude.h" //DO NOT edit this line
Status CreateSequence(Sequence &S, int n, ElemType *a) {
S.elem = a;
if(NULL == S.elem||n <= 0) return ERROR;
S.length = n;
return OK;
}
六、構建一個值為x的結點
【題目】連結串列的結點和指標型別定義如下
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode, *LinkList;
試寫一函式,構建一個值為x的結點。
要求實現下列函式:
LinkList MakeNode(ElemType x);
/* 構建一個值為x的結點,並返回其指標。 /
/ 若構建失敗,則返回NULL。 */
#include "allinclude.h" //DO NOT edit this line
LinkList MakeNode(ElemType x) {
// Add your code here
LinkList p;
p = (LinkList)malloc(sizeof(LNode));//sizeof裡面最好不要寫LinkList
If(! p) return NULL;
p->data = x;
return p;
}
七、構建長度為2且兩個結點的值依次為x和y的連結串列
【題目】連結串列的結點和指標型別定義如下
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode, *LinkList;
試寫一函式,構建長度為2且兩個結點的值依次為x和y的連結串列。
要求實現下列函式:
LinkList CreateLinkList(ElemType x, ElemType y);
/* 構建其兩個結點的值依次為x和y的連結串列。/
/ 若構建失敗,則返回NULL。 */
#include "allinclude.h" //DO NOT edit this line
LinkList CreateLinkList(ElemType x, ElemType y) {
// Add your code here
LNode *p1;
LNode *p2;
p1 = (LNode *)malloc(sizeof(LNode));
p2 = (LNode *)malloc(sizeof(LNode));
if(!p1||!p2) return NULL;
p1->data = x;
p1->next = p2;
p2->data = y;
p2->next = NULL;
return p1;
}
八、構建長度為2的升序連結串列
【題目】連結串列的結點和指標型別定義如下
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode, *LinkList;
試寫一函式,構建長度為2的升序連結串列,兩個結點的值
分別為x和y,但應小的在前,大的在後。
要求實現下列函式:
LinkList CreateOrdLList(ElemType x, ElemType y);
/* 構建長度為2的升序連結串列。 /
/ 若構建失敗,則返回NULL。 */
#include "allinclude.h" //DO NOT edit this line
LinkList CreateOrdLList(ElemType x, ElemType y) {
// Add your code here
LNode *p1,*p2;
p1 = (LNode *)malloc(sizeof(LNode));
p2 = (LNode *)malloc(sizeof(LNode));
If(!p1||!p2) return NULL;
ElemType t;
if(x > y){
t = x;
x = y;
y = t;
}
p1->data = x;
p1->next = p2;
p2->data = y;
p2->next = NULL;
return p1;
}