版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haimianjie2012/article/details/83829308
一、考研真题
3、设计一算法,实现在数据元素有序的顺序存储结构的线性表中插入一个值为x的操作。如果无存储空间则插入失败,函数的返回值为插入成功与否的标志。(8分)
4、设有两个整数集合A和B,分别用递增有序链表表示,设计一算法实现两个集合的联合运算,运算结果也有递增有序链表表示。运算后,A、B两个链表保持不变。(8分)
二、真题解析
3、设计一算法,实现在数据元素有序的顺序存储结构的线性表中插入一个值为x的操作。如果无存储空间则插入失败,函数的返回值为插入成功与否的标志。(8分)
#define QElemType int
#define MaxQSize 100 //队列最大元素个数
typedef struct
{
QElemType *base;
int rear;//指向循环队列中队尾元素的位置
int length;//表示队列中所含数据元素的个数
}SqQueue;
SqQueue Q;
int InsertQueue(SqQueue &L,int x)
{
//队列以满,插入失败
if (L.length>=MaxQSize)
return -1;
if(L.length<2)return -1;
int flag;//队列增序1,减序-1
if (L.base[L.length-1]-L.base[0]>=0)
{
flag=1;
}
else
{
flag=-1;
}
int m_index;
for (int i=L.length-1;i>=0;i--)
{
if (flag*(L.base[i]-x)<0)
{
m_index=i;
break;
}else{
L.base[i+1]=L.base[i];
}
}
L.base[m_index+1]=x;
L.length++;
return 0;
}
4、设有两个整数集合A和B,分别用递增有序链表表示,设计一算法实现两个集合的联合运算,运算结果也有递增有序链表表示。运算后,A、B两个链表保持不变。(8分)
LNode* Union(LNode* La,LNode* Lb)
{
if (La==NULL&&Lb==NULL)
return NULL;
if(La==NULL&&Lb!=NULL)
return Lb;
if(La!=NULL&&Lb==NULL)
return La;
LNode *pCHead = NULL; //A与B交集头
LNode *pCEnd = NULL; //A与B交集尾
//创建头结点
pCHead = new LNode();
pCHead->next = NULL;
pCEnd = pCHead;
LNode *pA = La->next; //指向有序列表A第一个结点
LNode *pB = Lb->next; //指向有序列表B第一个结点
while (pA != NULL && pB != NULL)
{
int data;
if (pA->data == pB->data)
{
data = pA->data;
//相等,同时后移
pA = pA->next;
pB = pB->next;
}
else if (pA->data > pB->data)
{
data= pB->data;
//最小的相比,B小 B后移
pB = pB->next;
}
else
{
data = pA->data;
//最小的相比,A小 A后移
pA = pA->next;
}
LNode *pNode = new LNode();
pNode->data = data;
//插入新建结点
pNode->next = pCEnd->next;
pCEnd->next = pNode;
pCEnd=pNode;
}
if (pB!=NULL)
{
pA=pB;
}
while (pA!=NULL)
{
LNode *pNode = new LNode();
pNode->data = pA->data;
//插入新建结点
pNode->next = pCEnd->next;
pCEnd->next = pNode;
pCEnd=pNode;
pA=pA->next;
}
return pCHead;
}