2021年数据结构考的算法题(😇 :也就是我们这届)是1、求单链表中数值为零的数目 2、折半插入排序
下面附上代码
1、求单链表中数值为零的数目
int count(LinkList L){
int j=0;
p= L->next;
while(p){
if(p->data ==0) j++;
p = p->next;
}
return j;
}
2、折半插入排序
void BInsertSort(SqList &L){
// 对顺序表L作折半插入排序。
for(i=2;i<=L.length; i++){
L.r[0] = L.r[i];
low = 1 ; high = i -1;
while(low<=high){ //在[low..high]中折半查找有序插入的位置
m = (low + high)/2;
if(LT(L.r[0].key,L.r[m].key)) high = m-1;
else low = m +1;
} //while
for( j =i -1; j>= high+1;--j) L.r[j+1] = L.r[j]; //记录后移
L.r[high +1] = L.r[0]; //插入
} //for
}// BInsertSort
这里是我复习时看的代码
1、有序顺序表的插入
void InsertOrderList(SqList &a,ElemType x){
if(a.length==a.listsize) return 0;
else{
i = a.length - 1;
while(i>=0&&x<a.elem[i]) i--;
for(j=a.length-1;j>=i+1;j--)
a.elem[j+1] = a.elem[j]; //元素后移
a.elem[i+1]=x; //插入x
a.length++; //表长加1
return ok;}
}// InserOrderList
2、 两个有序的单链表合并
void reverse_merge(LinkList &A,LinkList &B,LinkList &C)//把元素递增排列的链表A和B合并为C,且C中元素递减排列,使用原空间
{
pa=A->next;pb=B->next;pre=NULL; //pa和pb分别指向A,B的当前元素
while(pa||pb)
{
if(pa->data<pb->data||!pb)
{
pc=pa;q=pa->next;pa->next=pre;pa=q; //将A的元素插入新表
}
else
{
pc=pb;q=pb->next;pb->next=pre;pb=q; //将B的元素插入新表
}
pre=pc;
}
C=A;A->next=pc; //构造新表头
}//reverse_merge
3、 顺序表的删除
Status ListDelete_Sq(SqList&L, int i, ElemType &e){
// 在顺序线性表L中删除第i个元素,并用e返回其值
// i的合法值为 1<=i<=ListLength.Sq(L)
if((i<1)||(i>L.length)) return 0; //i值不合法
p = &(L.elem[i-1]); //P 为被删除元素的位置
e = *p; //被删除的元素赋值给e
q = L.elem+L.length-1; //表尾元素的位置
for(++p;p<=q;++p) *(p-1) = *p; //被删除元素之后的元素左移
--L.length; //表长减1
return OK;
} //ListDelete_Sq
4、单链表的删除
Status ListDelete_L(LinkList&L,int i, ElemType &e){
// 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
P = L; j = 0;
while(p->next && j<i-1){ //寻找第i个结点,并令P指回其前趋
p = p->next; ++j;
}
if(!(p->next)||j>i-1) return ERROR;
q= p->next; p->next = q->next;
e = q->data; free(q);
return OK;
} //ListDelete L;
5、顺序表上的查找
int search_sqtable(sqtable R,keytype K)
/*在表R从后往前查找键值为K的元素,返回元素的序号*/
{R.item[0].key=K;
i=R.n;
while(R.item[i].key!=K) i--;
return(i);
}
6、折半查找
int binserach(sqtable R,keytype K)
{low=1;hig=R.n;
while(low<=hig)
{mid=(low+hig)/2;
if(R.item[mid].key==K) return(mid);
else if(R.item[mid].key>K) hig=mid-1;
else low=mid+1;
}
return(0);
}
7、直接插入排序
void straightsort(int n,list r)
{for(i=2;i<=n;i++)
{r[0]=r[i];
j=i-1;
while(r[0].key<[r[j].key)
{r[j+1]=r[j];
j--; }
r[j+1]=r[0]; }
}
8、求二叉树的叶子数
void countleft(bitreptr t,int *count)
/*假定 *count的初值为0*/
{if(t!=NULL)
{if((t->lchild==NULL)&&(t->rchild==NULL)
*count++;
countleaf(t->lchild,count);
countleaf(t->rchild,count);
}
}
9、求二叉树的深度
int depth(bitreptr t)
/*求根为t 的二叉树的深度*/
{int dep1,dep2;
if(t==NULL) return(0);
else { dep1=depth(t->lchild);
dep2= depth(t->rchild);
if(dep1>dep2) return(dep1+1);
else return(dep2+1);
}
}
10、折半插入排序
void BInsertSort(SqList &L){
// 对顺序表L作折半插入排序。
for(i=2;i<=L.length; i++){
L.r[0] = L.r[i];
low = 1 ; high = i -1;
while(low<=high){ //在[low..high]中折半查找有序插入的位置
m = (low + high)/2;
if(LT(L.r[0].key,L.r[m].key)) high = m-1;
else low = m +1;
} //while
for( j =i -1; j>= high+1;--j) L.r[j+1] = L.r[j]; //记录后移
L.r[high +1] = L.r[0]; //插入
} //for
}// BInsertSort