例4:试用C或类C语言编写一高效算法,将一顺序 存储的线性表(设元素均为整型量)中所有零元 素向表尾集中,其他元素则顺序向表头方向集中。 (a a2.ai-l,ai ait1.,an 深圳华为公司 去年来校招聘 常见做法: 面试题 ①从前往后扫描,见到0元素则与尾部非0元素互换;X ②从后往前扫描,见到0元素则后面元素统统前移;X ③从前往后扫描,见到0元素先计数,再将后续的一 个非0元素前移,全部扫完后再把后续部分(长度为0 元素的个数)清0
6 例4:试用C或类C语言编写一高效算法,将一顺序 存储的线性表(设元素均为整型量)中所有零元 素向表尾集中,其他元素则顺序向表头方向集中。 深圳华为公司 去年来校招聘 常见做法: 面试题 ①从前往后扫描,见到0元素则与尾部非0元素互换; ②从后往前扫描,见到0元素则后面元素统统前移; ③从前往后扫描,见到0元素先计数,再将后续的一 个非0元素前移,全部扫完后再把后续部分(长度为0 元素的个数)清0。 (a1 , a2 , . ai-1, ai, ai+1 ,., an)
解:void SortA(sqlist&L int i-0,zerosum =0; ifL.length==O)return(O),/空表则结束 else for(i=1;iL.length;i++) if (L.v[i]0)L.v[i-zerosum]=L.v[i]; else zerosum++; for(i=L.length-zerosum+1;i<=L.lengt L.v1=0 /表的后部补0 return(ok); }/∥SortA 若表完全不空,也 要移动n次?
7 解: void SortA(sqlist &L) { int i=0, zerosum =0; if(L.length= =0) return(0); //空表则结束 else { for( i=1; i<=L.length; i++) {if (L.v[i]<>0) L.v[i- zerosum]= L.v[i]; else zerosum++; } } for( i= L.length-zerosum+1; i<=L.length; i++) L.v[i]=0; //表的后部补0 return(ok); }// SortA 若表完全不空,也 要移动n次?
若考虑表完全非空的情况,则程序要变长很多。 解:void SortA(sqlist&L) int i-0,zerosum =0: if(L.length==0)return(0); /空表则不执行 for(i;i<=L.length;i++) (if (L.v[i]<0&zerosum!=0)L.v[i-zerosum]=L.v[i] else zerosum++};/适当移动非零元素,是零则增加计数 for(i=L.length-zerosum+1;i<=L.length;i++) L.v[i]=0; /表的后部补0 return(ok):
8 解: void SortA(sqlist &L) { int i=0,zerosum =0; if(L.length= =0) return(0); //空表则不执行 for( i; i<=L.length; i++) {if (L.v[i]<>0&zerosum!=0)L.v[i- zerosum]= L.v[i]; else zerosum++ }; //适当移动非零元素,是零则增加计数 for( i= L.length-zerosum+1; i<=L.length; i++) L.v[i]=0; //表的后部补0 return(ok); } 若考虑表完全非空的情况,则程序要变长很多
例5:若某种高级语言没有指针类型, 能否实 现链式存储和运算?如何实现? 答:能!虽然链表通常用动态级联方式存储,但 也可以用一片连续空间(一维数组)实现链式存 储,这种方式称为静态链表。 具体实现方法:定义一个结构型数组(每个元 素都含有数据域和指示域),就可以完全描述 链表,指示域就相当于动态链表中的指针。 指示域也常称为“游标
9 例5: 若某种高级语言没有指针类型,能否实 现链式存储和运算?如何实现? 具体实现方法:定义一个结构型数组(每个元 素都含有数据域和指示域),就可以完全描述 链表,指示域就相当于动态链表中的指针。 指示域也常称为“游标