数据结构算法题

这篇博客详细介绍了数据结构中的关键操作,包括有序顺序表的插入、两个有序单链表的合并、顺序表的删除、单链表的删除、顺序表上的查找、折半查找、直接插入排序、二叉树叶子数的计算、二叉树深度的求解以及折半插入排序。此外,还提供了2021年数据结构考试的算法题目,如单链表中零元素计数和折半插入排序的实现代码。这些内容对于理解和掌握数据结构的基本操作非常有帮助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦森森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值