/**********
【题目】试编写算法,计算 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,否则 OVERFLOW */
{
*/
int i,s=1;
if(n<0) return ERROR;
for(i=1;i<=n;i++)
{
}
a[i-1]=s*2*i;
if(a[i-1]>MAXINT) return OVERFLOW;
s=a[i-1];
return OK;
}
/**********
【题目】试写一算法,对序列 S 的第 i 个元素赋以值 e。
序列的类型定义为:
typedef struct {
ElemType *elem;
int
length;
} Sequence;
***********/
Status Assign(Sequence &S, int i, ElemType e)
/* 对序列 S 的第 i 个元素赋以值 e,并返回 OK。 */
/* 若 S 或 i 不合法,则赋值失败,返回 ERROR */
{
int j;
if(S.length<=i||S.length==0)return ERROR;
for(j=0;j!=i;j++);
S.elem[j]=e;
return OK;
}
/**********
【题目】试写一算法,由长度为 n 的一维数组 a 构建一个序列 S。
序列的类型定义为:
typedef struct {
ElemType *elem;
int
length;
} Sequence;
***********/
Status CreateSequence(Sequence &S, int n, ElemType *a)
/* 由长度为 n 的一维数组 a 构建一个序列 S,并返回 OK。 */
/* 若构建失败,则返回 ERROR
{
*/
int i;
if(n<=0) return ERROR;
S.elem=(ElemType*)malloc(sizeof(ElemType));
S.length=n;
for(i=0;i
/**********
【题目】链表的结点和指针类型定义如下
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode, *LinkList;
试写一函数,构建长度为 2 且两个结点的值依次为 x 和 y 的链表。
**********/
LinkList MakeNode(ElemType x)
{
LinkList Node;
Node = (LinkList)malloc(sizeof(LNode));
if(Node == NULL)
Node->data = x;
Node->next = NULL;
return Node;
return NULL;
}
LinkList CreateLinkList(ElemType x, ElemType y)
/* 构建其两个结点的值依次为 x 和 y 的链表。*/
/* 若构建失败,则返回 NULL。
{
*/
LinkList Node_x,Node_y;
Node_x = MakeNode(x);
Node_y = MakeNode(y);
if(Node_x==NULL&&Node_y==NULL)
Node_x->next = Node_y;
return Node_x;
}
return NULL;
/**********
【题目】链表的结点和指针类型定义如下
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode, *LinkList;
试写一函数,构建长度为 2 的升序链表,两个结点的值
分别为 x 和 y,但应小的在前,大的在后。
**********/
LinkList MakeNode(ElemType x)
{
LinkList Node;
Node = (LinkList)malloc(sizeof(LNode));
if(Node == NULL)
Node->data = x;
Node->next = NULL;
return Node;
return NULL;
}
LinkList CreateOrdLList(ElemType x, ElemType y)
/* 构建长度为 2 的升序链表。 */
/* 若构建失败,则返回 NULL。 */
{
LinkList p,q;
p=MakeNode(x);
q=MakeNode(y);
if((p->data)>(q->data)) {q->next=p;
else p->next=q;
return p;
return q;}
}
/**********
【题目】试写一算法,实现顺序栈的判空操作
StackEmpty_Sq(SqStack S)。
顺序栈的类型定义为:
typedef struct {
ElemType *elem; // 存储空间的基址
int top;
int size;
int increment;
// 栈顶元素的下一个位置,简称栈顶位标
// 当前分配的存储容量
// 扩容时,增加的存储容量
// 顺序栈
} SqStack;
***********/
Status StackEmpty_Sq(SqStack S)
/* 对顺序栈 S 判空。
/* 若 S 是空栈,则返回 TRUE;否则返回 FALSE */
{
*/
if(!S.top)return TRUE;
else return FALSE;
}
/**********
【题目】试写一算法,实现顺序栈的取栈顶元素操作
GetTop_Sq(SqStack S, ElemType &e)。
顺序栈的类型定义为:
typedef struct {
ElemType *elem;
int top;
int size;
int increment;
// 存储空间的基址
// 栈顶元素的下一个位置,简称栈顶位标
// 当前分配的存储容量
// 扩容时,增加的存储容量
// 顺序栈
} SqStack;
***********/
Status GetTop_Sq(SqStack S, ElemType &e)
/* 取顺序栈 S 的栈顶元素到 e,并返回 OK; */
/* 若失败,则返回 ERROR。
{
*/
e=S.elem[S.top-1];
if(e!='\0')return OK;
return ERROR;
}
/**********
【题目】试写一算法,实现顺序栈的出栈操作
Pop_Sq(SqStack &S, ElemType &e)。
顺序栈的类型定义为:
typedef struct {
ElemType *elem;
int top;
int size;
int increment;
// 存储空间的基址
// 栈顶元素的下一个位置,简称栈顶位标
// 当前分配的存储容量
// 扩容时,增加的存储容量
// 顺序栈
} SqStack;
***********/
Status Pop_Sq(SqStack &S, ElemType &e)
/* 顺序栈 S 的栈顶元素出栈到 e,并返回 OK;*/
/* 若失败,则返回 ERROR。
{
*/
e=S.elem[S.top-1];
S.top--;
if(e!='\0')return OK;
else return ERROR;
}
/**********
【题目】若顺序栈的类型重新定义如下。试编写算法,
构建初始容量和扩容增量分别为 size 和 inc 的空顺序栈 S。
typedef struct {
ElemType *elem; // 存储空间的基址
ElemType *top;
int size;
int increment;
// 当前分配的存储容量
// 扩容时,增加的存储容量
// 栈顶元素的下一个位置
} SqStack2;
***********/
Status InitStack_Sq2(SqStack2 &S, int size, int inc)
/* 构建初始容量和扩容增量分别为 size 和 inc 的空顺序栈 S。*/
/* 若成功,则返回 OK;否则返回 ERROR。
{
*/
return ERROR;
if(size<=0||inc<=0) return ERROR;
ElemType* base;
base = (ElemType*)malloc(size*sizeof(ElemType));
if(base == NULL)
S.elem = base;
S.top = base;
S.size = size;
S.increment = inc;
return OK;
}
/**********
【题目】若顺序栈的类型重新定义如下。试编写算法,
实现顺序栈的判空操作。
typedef struct {
ElemType *elem; // 存储空间的基址
ElemType *top;
int size;
int increment;
// 当前分配的存储容量
// 扩容时,增加的存储容量
// 栈顶元素的下一个位置
} SqStack2;
***********/
Status StackEmpty_Sq2(SqStack2 S)
/* 对顺序栈 S 判空。
*/
/* 若 S 是空栈,则返回 TRUE;否则返回 FALSE */
{
if(S.elem==S.top) return TRUE;
else return FALSE;
}
/**********
【题目】若顺序栈的类型重新定义如下。试编写算法,
实现顺序栈的入栈操作。
typedef struct {
ElemType *elem; // 存储空间的基址
ElemType *top;
int size;
int increment;
// 当前分配的存储容量
// 扩容时,增加的存储容量
// 栈顶元素的下一个位置
} SqStack2;
***********/
Status Push_Sq2(SqStack2 &S, ElemType e)
/* 若顺序栈 S 是满的,则扩容,若失败则返回 ERROR。*/
/* 将 e 压入 S,返回 OK。
{
*/
ElemType *newbase;
if(S.top>=S.size){
int t=S.top-S.elem;
newbase=(ElemType*)realloc(S.elem,(S.size+S.increment)*sizeof(ElemType));
if(NULL==newbase)return ERROR;
S.elem=newbase;
S.top=S.elem+t;
}
*S.top++=e;
return OK;
}
/**********
【题目】若顺序栈的类型重新定义如下。试编写算法,
实现顺序栈的出栈操作。
typedef struct {
ElemType *elem; // 存储空间的基址
ElemType *top;
int size;
// 当前分配的存储容量
// 栈顶元素的下一个位置