《数据结构打卡》第8天
0、编写一个算法,要求将奇数最先输出,偶数最后输出。
void fun(ElemType a[],int n)
{ int i; ElemType e;
SqStack *st1,*st2;
InitStack(st1);
InitStack(st2);
for (i=0;i<n;i++)
if (a[i]%2==1)
Push(st1,a[i]);
else
Push(st2,a[i]);
i=0;
while (!StackEmpty(st1))
{
Pop(st1,e);
a[i++]=e;
}
while (!StackEmpty(st2))
{
Pop(st2,e);
a[i++]=e;
}
DestroyStack(st1);
DestroyStack(st2);
}
答:算法的执行步骤如下:
(1)扫描数组 a,将所有奇数进到 st1 栈中,将所有偶数进到 st2 栈中。
(2)先将 st1 的所有元素(奇数元素)退栈,并放到数组 a 中并覆盖原有位置的元素;
再将 st2 的所有元素(偶数元素)退栈,并放到数组 a 中并覆盖原有位置的元素。
(3)销毁两个栈 st1 和 st2。
所以本算法的功能是,利用两个栈将数组 a 中所有的奇数元素放到所有偶数元素的前
面。例如,ElemType a[]={1,2,3,4,5,6},执行算法后数组 a 改变为{5,3,1,6,4,2}。
1、设顺序表va中的数据元素递增有序。试设计一个算法,将x插入到顺序表的适当位置上,以保持该表的有序性。(10分)
void Insert_SqList(SqList va,int x)/*把x插入递增有序表va中*/
{ int i;
if(va.length> MAXSIZE) return;
for(i=va.length-1;va.elem[i]>x&&i>=0;i--)
va.elem[i+1]=va.elem[i];
va.elem[i+1]=x;
va.length++;
}/*Insert_SqList*/
2、编写算法,实现带头结点单链表的逆置算法(10分)
算法思路:首先把头结拆下来,然后使用头插法的方式依次把每个结点倒序接入到头结点之后。
void Reverse_L(Linklist &L){
if(!p->next || !p->next->next) return; //若为空表或表长为1时不做处理
Lnode *p,*r;
p = L->next; //p指向首元结点
L->next = Null; //拆开头结点,指针域设为空
while(p!=Null){
r = p->next; //r暂存p的后继结点
p->next = L->next; //采用头插法,将p结点插入到头结点之后
L->next = p; //头结点始终指向新插入的结点
p = r; //结点插入完以后,p指向下一结点
}
}
3、已知指针 Ta和 Tb分别指向两个单链表的头结点,设计一个算法将这两个链表连接在一起(即令其中一个表的首元结点连在另一个表的最后一个结点之后)