当前位置:   article > 正文

SCAU数据结构笔试算法设计题汇总_一个线性表中的元素为正整数或负整数

一个线性表中的元素为正整数或负整数

2021

1、设计一个算法deleteMinNode(LinkList &L),在带头结点的单链表L中删除所有结点值最小的结点(可能有多个结点值最小的结点)。

typedef struct LNode          

{

     ElemType  data;

     struct LNode   *next;

}LNode, *LinkList;

1、参考答案:

用p从头至尾扫描单链表,pre指向*p结点的前驱,用minp保存值最小的结点指针,minpre指向*minp结点的前驱。一面扫描,一面比较,将最小值的结点放到*minp中。删除节点总是要考虑定义一个前驱节点记录位置。算法如下:

  1. void deleteMinNode (LinkList &L)
  2. {
  3. LinkList pre=L, p=pre->next, minp=p, minpre=pre;
  4. ElemType mindata=p->data;
  5. while (p!=NULL && p->data<mindata)
  6. { mindata=p->data;
  7. p=p->next;
  8. }
  9. p=pre->next;
  10. while (p!=NULL)
  11. {
  12. if (p->data==mindata)
  13. { pre->next=p->next;
  14. free(p);
  15. }
  16. pre=pre->next;
  17. p=pre->next;
  18. }
  19. }

2、二叉树用二叉链表存储表示。

typedef struct BiTNode

{

   TelemType  data;

   Struct BiTNode *lchild, *rchild;

} BiTNode, *BiTree;

编写一个复制一棵二叉树的递归算法。

统一使用如下函数名:BiTree  CopyTree(BiTree  T)

  1. BiTree CopyTree(BiTree T) {
  2. if (!T ) return NULL;
  3. if (!(newT = (BiTNode*)malloc(sizeof(BiTNode))))
  4. exit(Overflow);
  5. newT-> data = T-> data;
  6. newT-> lchild = CopyTree(T-> lchild);
  7. newT-> rchild = CopyTree(T-> rchild);
  8. return newT;
  9. }

 2020

1  设计算法判断带头节点的单链表L是否是递增的单链表,单链表的存储结构如下。

typedef struct  LNode

 {

   ElemType  data;

   LNode  *next;

 }LNode,  *LinkList;

  1. int isriselk(LinkList &L)
  2. {
  3. LNode *p = L->next, *q;
  4. if(p != NULL)
  5. {
  6. while(p->next != NULL)
  7. {
  8. q = p->next; //q是p的后继
  9. if (q->data > p->data) //只要是递增的,就继续考察其后继
  10. p = q;
  11. else return false; //只要有一个不是后继大于前驱,便不是递增
  12. }

      2  用按层次顺序遍历二叉树的方法,统计树中具有度为1的结点数目,可以调用教材上实现的队列和栈等数据结构的相关算法,二叉树采用二叉链表存储,存储结构如下。

typedef struct BiTNode {

  TElemType data;

  struct BiTNode  * lchild,* rchild;

} BiTNode,*BiTree;

  1. int Level(BiTree bt) //层次遍历二叉树,并统计度为1的结点的个数
  2. {
  3. SqQueue Q;
  4. int num=0; //num统计度为1的结点的个数
  5. if(bt)
  6. {
  7. InitQueue (Q);
  8. EnQueue (Q,bt);//Q是以二叉树结点指针为元素的队列
  9. while(!QueueEmpty(Q))
  10. {
  11. p=DeQueue(Q);
  12. cout<<p->data; //出队,访问结点
  13. if(p->lchild && !p->rchild ||!p->lchild && p->rchild)
  14. num++;
  15. //度为1的结点
  16. if(p->lchild)
  17. EnQueue(Q,p->lchild); //非空左子女入队
  18. if(p->rchild)
  19. EnQueueIn(Q,p->rchild); //非空右子女入队
  20. } // while(!QueueEmpty(Q))
  21. }//if(bt)
  22. return(num);
  23. }//返回度为1的结点的个数

 2019

二叉树有先序、中序、后序、按层遍历等遍历序列,给定中序和其它一种遍历序列可以用递归的方式确定一棵二叉树的结构。假定一棵二叉树的每个结点都用一个小写字母表示,现在给出二叉树的先序和中序遍历序列,编写算法输出其后序遍历序列。

输入共两行,第一行一个字符串,表示树的先序遍历,第二行一个字符串,表示树的中序遍历。输出一行,表示树的后序遍历序列。

【输入样例】

abdec

dbeac

【输出样例】

debca

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. char x[35],z[35];
  5. typedef struct Binode
  6. {
  7. char data;
  8. struct Binode *lchild,*rchild;
  9. }Binode,*Bitree;
  10. void creat(Bitree &T,int xl,int xr,int zl,int zr)
  11. {
  12. if(xl>xr||zl>zr)
  13. {
  14. T=NULL;
  15. return;
  16. }
  17. int pos;
  18. T=new Binode;
  19. T->data=x[xl];
  20. for(int i=zl;i<=zr;i++)
  21. {
  22. if(z[i]==x[xl])
  23. {
  24. pos=i;
  25. break;
  26. }
  27. }
  28. int len=pos-zl;
  29. creat(T->lchild,xl+1,xl+len,zl,pos-1);
  30. creat(T->rchild,xl+1+len,xr,pos+1,zr);
  31. }
  32. void show(Bitree T)
  33. {
  34. if(T)
  35. {
  36. show(T->lchild);
  37. show(T->rchild);
  38. cout<<T->data;
  39. }
  40. }
  41. int main()
  42. {
  43. cin>>x>>z;
  44. Bitree T;
  45. int n=strlen(x);
  46. creat(T,0,n-1,0,n-1);
  47. show(T);
  48. }

从键盘读入一个后缀表达式(字符串),只含有0-9组成的运算数及加(+)、减(—)、乘(*)、除(/)四种运算符。每个运算数之间用一个空格隔开,不需要判断给你的表达式是否合法。以@作为结束标志。输出表达式的结果。

比如,169*(4+3)转换成后缀表达式为:16943+*–,(□代表空格)在字符数组A中的形式为(下图):

  1. 算法思想:读取数据,数值型入栈,运算符出栈两个元素计算后后结果入栈。
  2. #include <iostream>
  3. #include <stack>
  4. using namespace std;
  5. string s;
  6. stack <long long> st;
  7. long long getnum(int p)
  8. {
  9. long long i=p,sum=0;
  10. while(isdigit(s[i]))
  11. {
  12. sum=sum*10+s[i]-'0';
  13. i++;
  14. }
  15. return sum;
  16. }
  17. int main()
  18. {
  19. long long i,j,x1,x2;
  20. getline(cin,s);
  21. i=0;
  22. while(s[i]!='@')
  23. {
  24. if(isdigit(s[i]))
  25. {
  26. st.push(getnum(i));
  27. while(isdigit(s[i]))
  28. i++;
  29. }
  30. else if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/')
  31. {
  32. switch(s[i])
  33. {
  34. case '+':x2=st.top();st.pop();x1=st.top();st.pop();st.push(x1+x2);break;
  35. case '-':x2=st.top();st.pop();x1=st.top();st.pop();st.push(x1-x2);break;
  36. case '*':x2=st.top();st.pop();x1=st.top();st.pop();st.push(x1*x2);break;
  37. case '/':x2=st.top();st.pop();x1=st.top();st.pop();st.push(x1/x2);break;
  38. }
  39. i++;
  40. }
  41. else
  42. {
  43. i++;
  44. }
  45. }
  46. cout<<st.top();
  47. return 0;
  48. }

2018

1一个线性表中的元素为正整数或负整数。设计一个算法,将正整数和负整数分开,使得线性表前半部分均为负整数,后半部分均为正整数。不要求对这些元素排序,但要求尽量减少元素交换次数。线性表使用顺序存储结构,其定义如下:

typedef  struct{

  int  *elem;

  int  listsize;

  int  length;

}SqList

统一使用函数名:void exchange(SqList L)

  1. 算法思想:设置好上下界,从两端查找正整数和负整数,然后交换,直到上下界相遇。
  2. void exchange(SqList L)
  3. {
  4. int i = 0;
  5. int j = L.length-1;
  6. while(i<j)
  7. {
  8. while(i<j&&L.elem[i]<0) i++;
  9. while(i<j&&L.elem[j]>0) j++;
  10. if(i<j)
  11. {
  12. int temp=L.elem[i];
  13. L.elem[i]=L.elem[j];
  14. L.elem[j]=temp;
  15. i++;
  16. j--;
  17. }
  18. }
  19. }

以二叉链表为存储结构,编写求二叉树中叶子节点个数的算法。

二叉树的二叉链表存储结构定义如下:

typedef struct BiTNode{

int     data;

struct BiTNode  * lchild, * rchild;

} BiTNode, * BiTree;

    统一使用函数名:int countLeaf(BiTree T)

  1. 算法思想:递归实现二叉树叶子节点数=左子树叶子节点数+右子树叶子节点数
  2. int countLeaf(BiTree T)
  3. {
  4. if(T==NULL)
  5. return 0;
  6. else if(T->lchile==NULL&&T->rchile=NULL)
  7. return 1;
  8. else
  9. return countLeaf(T->lchild)+countLeaf(T->rchild)
  10. }

2017

 1设有一线性表A=a0,a1,..., ai,...an-1),其逆线性表定义为A'=( an-1,..., ai,...,a1, a0),设计一个算法,将线性表逆置,要求线性表仍占用原线性表的空间,线性表采用顺序存储结构。

  1. Typedef struct
  2. {
  3. ElemType *elem; // 存储空间基址
  4. int length; // 当前长度
  5. int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位)
  6. }SqList ;
  7. void ListInvert(SqList &L)
  8. {
  9. ElemType x;
  10. int i;
  11. for(i=0; i<L.length/2; i++)
  12. {
  13. x=L.elem[i]
  14. L.elem[i]=L.elem[L.length-i-1];
  15. L->data[L.elem-i-1]=x;
  16. }
  17. }

已知一棵结点数据类型为整数的满二叉树顺序存储在数组B[1…n]中,设计一个算法,产生二叉树的二叉链表。

叉树的二叉链存储结构如下:

typedef struct BiTNode{

int     data;

struct BiTNode  * lchild, * rchild;

} BiTNode, * BiTree;

  1. Void CreateTree(BiTree T , int index){
  2. if(index>n)
  3. T=NULL;
  4. else{
  5. T=(BiTNode *)malloc(sizeof(BiTree ));
  6. T->data=B[index];
  7. CreateTree(T->lchild, index * 2 );
  8. CreateTree(T->rchild, index * 2 + 1);
  9. }
  10. }

2016

1、编写算法,将两个非递减有序顺序表LA和LB合并成一个新的非递减有序顺序表LC:

typedef struct

{

    int *elem;

    int length;

    int listsize;

}SqList;

Status InitList_Sq(SqList &L)

{

  // 构造一个空的线性表L

  L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));

  if (!L.elem) return OK;        // 存储分配失败

  L.length = 0;                  // 空表长度为0

  L.listsize = LIST_INIT_SIZE;   // 初始存储容量

  return OK;

}

统一使用如下函数名:int  MergeList (SqList  La,  SqList  Lb,  SqList  &Lc)

  1. int MergeList_Sq(SqList La,SqList Lb,SqList &Lc){
  2. ElemType *pa,*pa_last,*pb,*pb_last,*pc;
  3. pa=La.elem;
  4. pb=Lb.elem;
  5. Lc.listsize=Lc.length=La.length+Lb.length;
  6. pc=Lc.elem=(ElemType *)malloc(Lc.listsize*sizeof(ElemType));
  7. if(!Lc.elem)
  8. return ERROR;
  9. pa_last=La.elem+La.length-1;
  10. pb_last=Lb.elem+Lb.length-1;
  11. while(pa<=pa_last&&pb<=pb_last)
  12. { // 归并
  13. if(*pa<=*pb)
  14. *pc++=*pa++;
  15. else
  16. *pc++=*pb++;
  17. }
  18. while(pa<=pa_last)
  19. *pc++=*pa++;
  20. while(pb<=pb_last)
  21. *pc++=*pb++;
  22. return OK;
  23. }

2、编写算法,设计判断一棵二叉树是否是完全二叉树的算法。

二叉树的存储结构定义如下:

typedef struct BTNode

 {

   int data;

   struct BTNode *lchild,*rchild;

 }BTNode,*BTree;

其中队列数据结构的基本操作如下:

InitQueue(Queue &Q);构造一个空队Q

QueueEmpty(Queue Q) ;//若队列为空返回TRUE,否则返回FALSE

EnQueue(Queue &Q,e);入队

DeQueue(Queue &Q,e);出队,并用e返回

假定上述操作已经实现,直接调用即可。

统一使用如下函数名:int  IsCompleteTree(BTree  T)

  1. int IsCompleteTree( BTree T ) //是完全二叉树,则返回1;否则返回0
  2. {
  3. BTree p = T;
  4. if (p==0) return 1;
  5. Queue Q;
  6. InitQueue(Q);
  7. EnQueue(Q, p);
  8. int flag = 0;
  9. while (!QueueEmpty(Q)) {
  10. DeQueue(Q, p);
  11. if (p->lchild && !flag)
  12. EnQueue(Q, p->lchild);
  13. else {
  14. if (p->lchild) return 0;
  15. else flag = 1;
  16. }
  17. if (p->rchild && !flag)
  18. EnQueue(Q, p->rchild);
  19. else {
  20. if (p->rchild) return 0;
  21. else flag = 1;
  22. } // while
  23. return 1;
  24. }

2015

1、将头指针为a的单链表A分解成两个单链表A和B,表A头指针为a,表B的头指针为b,表A含有原单链表A序号为奇数的元素,而表B含有原单链表A序号为偶数的元素,且均保持原来的相对次序。

     单链表存储结构定义如下:

struct LNode

 {

   int data;

   struct LNode *next;

 };

 typedef struct LNode *LinkList;

统一使用函数名:void  Split(LinkList & A,LinkList & B) 

  1. void Split(LinkList & A,LinkList & B)
  2. {
  3. LNode *p,*q,*r;
  4. B= (LNode*)malloc(sizeof(LNode));
  5. B->next = NULL;
  6. r = B;
  7. p = A->next;
  8. while(p!=NULL && p->next!=NULL)
  9. {
  10. q = p->next;
  11. if(q!=NULL)
  12. {
  13. p->next = q->next;
  14. r->next = q;
  15. r = q;
  16. p = p->next;
  17. }
  18. }
  19. r->next = NULL;
  20. }

2、一个具有n个结点的完全二叉树采用顺序存储方式,其数据存放在整型一维数组a中,编写非递归算法对其进行先序遍历。

算法可以直接调用栈的基本操作:

初始化:InitStack(SqStack &S)

  入栈:Push(SqStack &S,int e)

出栈:Pop(SqStack &S,int &e)

判断栈空: Empty(SqStack S)

统一使用函数名:void  preorder(int a[], int n)

  1. void preorder(int a[], int n)
  2. {
  3. SqStack S;
  4. InitStack(S);
  5. Push(S,0);
  6. int i = 1;
  7. int j = 2*i;
  8. visit(a[i]);
  9. Push(S,i);
  10. while(Empty(S))
  11. {
  12. while(j<=n)
  13. {
  14. Push(S,j);
  15. i=j; j=2*i;
  16. visit(a[i]);
  17. }
  18. Pop(S,i);
  19. j = 2*i+1;
  20. }
  21. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/761687
推荐阅读
相关标签
  

闽ICP备14008679号