数据结构期末考试复习--3

删除 L 中所有值为 item 的元素

void  Delete_e(SqList &L,ElemType e)
{int i=0,j=L.length-1;//设置数组低、高端指针(下标)。
 while(i<j)
   { while(i<j&&L.elem[i]!=e)i++; //若值不为e,右移指针。
     while(i<j&&L.elem[j]==e){ j--; // L.length--;
            }//若右端元素为item,指针左移
     if(i<=j){L.elem[i++]=L.elem[j--];   //L.length--;
                         }
 L.length=i-1;
 }
}

将数组中所有正数排在所有负数的前面

void Arrange(int A[],int n)
//n个整数存于数组A中,本算法
 {int i=0,j=n-1,x;  //数组下标从0开始
  while(i<j)
  {while(i<j && A[i]>0)  i++;
   while(i<j && A[j]<0)  j--;
   if(i<j) {x=A[i]; A[i++]=A[j]; A[j--]=x; }
                                                 //交换A[i] 与A[j]  }
     }//算法Arrange结束.

双冒泡

void DoubleBubbleSort(KeyType R[],int n)
{    int i,low=0,high=n-1;
     KeyType temp;
    bool exchange;
    while(low<high)
    { exchange=false;
        //从前往后进行一次冒泡排序,将最大的值放在最后一个位置
        for(i=low;i<high;++i)
          {
           if(R[i]>R[i+1]) //如果前面的值比后面的值大,发生交换
               {  temp=R[i];  R[i]=R[i+1]; R[i+1]=temp;
                   exchange=true;
               }
           }
           //从后往前进行一次冒泡排序,将最小的值放在第一个位置
        for(i=high-1;i>low;--i)
        {  if(R[i]<R[i-1]) //如果后面的值比前面的值小,发生交换
            {
                temp=R[i];    R[i]=R[i-1];  R[i-1]=temp;
                exchange=true;
            }
        }
        if(!exchange)   //本趟没有发生交换,提前终止
            return;
               ++low; //更新上下边界
             --high;
    }
}

求链表的最大数

Status  Maxelem_L(LinkList L,int &max)
{  if (L->next==NULL) return error
   else
     { LNode *p=L->next;
       max=p->data;       p=p->next;
       while(p)
        {  if(p->data>max)      max=p->data;
            p=p->next;
          }
    }
  return  ok;
}

递归方法求链表的最大数

int GetMax(LinkList p)
{
    if(!p->next)
        return p->data;
    else
    {
        int max=GetMax(p->next);
        return p->data>=max ? p->data:max;
    }
}

利用栈数值转换算法

    void conversion ( int N,int k) {
    initstack ( S );
    while ( N ) {
            push (S,N%k);
            N = N / k;
            }
        while ( ! Stackempty(s) ){
            pop ( S,e );
                if(e<=9)
                    cout<<e;
                else
                    cout<<char(e+55);
}
           }//conversion
}

递归方法实现进制转换

void conversion(int n)
{
    if(n==0)    return ;
    else
    {
        conversion(n/8);
        cout<<n%8;
                      }
}

在有序表 ST 中折半查找

int Search_Bin(SSTable ST,KeyType key,int low,int high)
 {
  if(low<=high)
   {     mid=(low+high)/2;
     if (key=ST.elem[mid].key)  // 找到待查元素
            return mid;
     else if LT(key,ST.elem[mid].key)
           return Search_Bin( ST, key,low,mid-1);
     else
       return   Search_Bin( ST, key,mid+1,high);   }
else return 0; // 顺序表中不存在待查元素
 }

二叉排序树查找

BSTree Searchlev(BSTree T,char key,int &lev) {
  //在根指针T所指二叉排序树中递归地查找某关键字等于key的数据元素
  //若查找成功,则返回指向该数据元素结点的指针和层次,否则返回空指针
  if(T)
     { lev++;
      if( key==T->data.key) return T;               //查找结束
      else if (key<T->data.key)
          return Searchlev(T->lchild,key,lev);  //在左子树中继续查找
      else  return Searchlev(T->rchild,key,lev);   //在右子树中继续查找
    }
else   return T;
}

二叉排序树查找非递归

BSTree Searchlev(BSTree T,int key,int &lev){
    BSTree p=T;
    while(p){
         ++lev;
        if (key==p->data.key)    return  p;
        else if (key<p->data.key)
                p=p->lchild;     //在左子树中继续查找
        else   p=p->rchild;     //在右子树中继续查找
            }
        return   p;
     }

统计输入字符串中数字字符和字母字符的个数

void count()
{ int i,num[36];  char ch;
  for (i=0;i<36;i++) num[i]=0;
  while ((ch=getchar())!='#')
  {  if('0'<=ch&&ch<='9')
      {   i=int(ch)-48; num[i]++;}
     else if('A'<=ch&&ch<='Z')
      {i=ch-65+10;  num[i]++;}
    }
  for(i=0;i<10;i++)
      cout<<"数字"<<i<<"的个数"<<num[i]<<endl;
  for(i=10;i<36;i++)
    cout<<"字母"<<char(i+55)<<"的个数"<<num[i]<<endl;
}

统计串 S 中字符的种类和个数

void StrAnalyze(SString S)//统计串S中字符的种类和个数
{char c;   mytype T[20]; //用结构数组T存储统计结果
 int i,j;
 for (i=0;i<=20;i++) T[i].ch='\0';
  for(i=1;i<=S.length;i++)
  {    c=S[i];j=0;
    while(T[j].ch&&T[j].ch!=c)  j++; //查找当前字符c是否已记录过
    if(T[j].ch)   T[j].num++;
    else { T[j].ch=c;T[j].num++;}
  }//for
  for(j=0;T[j].ch;j++)
   cout<<T[j].ch<<":"<<T[j].num<<endl;
}//StrAnalyze

应用二叉排序树分类统计

void CreaTree(BTree &p,char c) //采用递归方式构造一棵二叉排序树
{   if (p==NULL)    //p为NULL,则建立一个新结点
    {
        p=new tnode;
        p->ch=c;
        p->count=1;
        p->lchild=p->rchild=NULL;
    }
    else if (c==p->ch)
        p->count++;
    else if (c<p->ch)
        CreaTree(p->lchild,c);
    else
        CreaTree(p->rchild,c);
}

链表的调整-逆置带头结点的单链表

void  inverse(LinkList &L) {
    // 逆置带头结点的单链表 L
    p=L->next;  L->next=NULL;
    while ( p) {
        q=p->next;    // q指向*p的后继
        p->next=L->next;
        L->next=p;       // *p插入在头结点之后
        p = q;
    }
}

链表选择排序

void LinkedListSelectSort(LinkedList head)
 //本算法一趟找出一个关键字最小的结点,其数据和当前结点进行交换;
//若要交换指针,则须记下当前结点和最小结点的前驱指针
  p=head->next;
  while(p!=NULL)
    {
        q=p->next; r->data=p->data;    //设r是指向关键字最小的结点的指针
     while (q!=NULL)
      {
          if(q->data<r->data) r->data=q->data;
          q=q->next;
    }
     if(r!=p)  r->data<-->p->data;//这里表示交换这两个节点
            p=p->next;
    }

原文地址:https://www.cnblogs.com/ygjzs/p/12154373.html

时间: 2024-10-08 08:39:59

数据结构期末考试复习--3的相关文章

厦门大学数据结构期末考试单链表问题

因为过几天要去参加厦门大学的夏令营,提前刷了下厦门大学往年的期末考试试卷. 卷中有这么一道题目: 有一个单链表,其结点的元素值以递增顺序排列,给出数据结构,并编写一个算法删除该单链表中元素值相同的结点. 算法如下: 从头到尾扫描单链表,若当前结点和后继结点的值不相同,则指针后移,若相同,则删除该后继结点. 1 #include "stdio.h" 2 3 typedef struct Node{ 4 int data; 5 struct Node *next; 6 }Node, *Li

数据结构期末考试算法

1.设计一个高效的算法,从顺序表L中删除所有值为x的元素,要求时间复杂度为O(n),空间复杂度为O(1). //p71 #define MAXSIZE 100 typedef struct { ElemType elem[MAXSIZE]; int last; }SeqList; void delx(SeqList * L,ElemType x) { int i = 0; int j = 0; while(i <= L->last) { if(L->elem[i]!=x) { L->

期末考试复习c#时总结的抽象类与接口的一些区别

抽象类: (1)抽象类中可以定义抽象方法,属性,变量 (2)抽象类的派生类必须实现所有的抽象方法.要求所有的派生非抽象类都要用override重写实现抽象方法. (3)抽象类可以存放抽象方法,属性,也可以存放非抽象类的方法,属性 (4)一个父类可以有多个子类,一个子类只能有一个父类 接口: (1)接口的成员可以是方法.属性.索引器和事件,但不可以有任何的成员变量 (2)接口的成员默认是公共的,因此不允许成员加上修饰符. (3)接口可以实现多继承

期末考试复习

一 二 三 四 五 六 日 29 30 1 2 高数 17:30-19:00 3 4 5 6 7 8 9 sql 08:30-10:30 10 11 12 13 汇编 08:30-10:30 14 编译 08:30-10:30 15 jsp 13:30-14:30 16 17 计组 08:30-10:30    

java 期末考试复习

inheritance ? Constructors are inherited, but use super() public class Parent { public Parent() { do some code; } } public class Child extends Parent { public Child() { super(); // call Parent() do some more code; } } so in a main method: Child c = n

机器学习与数据挖掘期末考试复习重点整理

分类: – 有类别标记信息, 因此是一种监督学习 – 根据训练样本获得分类器,然后把每个数据归结到某个已知的类,进而也可以预测未来数据的归类. 聚类: – 无类别标记, 因此是一种无监督学习 – 无类别标记样本,根据信息相似度原则进行聚类,通过聚类,人们能够识别密集的和稀疏的区域,因而发现全局的分布模式,以及数据属性之间的关系 聚类方法: 划分方法  - (分割类型) K-均值K-Means 顺序领导者方法 基于模型的方法 基于密度的方法 层次方法(Hierarchical Methods) K

数据结构期末复习第一章绪论

前言: 最近快期末了,复习下数据结构,下列习题和答案解析,大部分来源于网络,如有不对之处还请指出. 在这里,星云祝各位考生期末考试顺利,新年快乐! 第一章绪论 1. 数据结构是一门研究非数值计算的程序设计问题中计算机的(操作对象)以及它们之间的(关系)和(操作)的学科. 2. 下列关于数据结构的基本概念中,叙述正确的是( C ). A. 数据元素是数据的最小单位. B. 数据的逻辑结构是指数据的各数据项之间的逻辑关系. C. 任何一个算法的设计取决于选定逻辑结构,而算法的实现依赖于采用的存储结构

数据结构期末复习第五章数组和广义表

数据结构期末复习第五章 数组和广义表 二维数组A[m][n]按行优先 寻址计算方法,每个数组元素占据d 个地址单元.     设数组的基址为LOC(a11) :LOC(aij)=LOC(a11)+((i-1)*n+j-1)*d     设数组的基址为LOC(a00) :LOC(aij)=LOC(a00)+( i*n+j )*d    二维数组A[m][n]按列优先 寻址计算方法,每个数组元素占据d 个地址单元.     设数组的基址为LOC(a11) :LOC(aij)=LOC(a11)+((j

数据结构期末复习(三)

数据结构期末复习(三) 数组的存储结构 二维数组的顺序存储结构分为以行序为主序的存储方式和以列序为主序的存储方式. 以行序为主的存储方式就是常规的先存第0行的每列,再存第一行的每列,以此类推.以列为主的存储方式同理. 对于三维数组来说,按下标从左到右的顺序存储.例如,设a[0][0][0]的地址为p,则对于数组a[m][n][r],a[i][j][k] = p + (i*n*r + j*r + k)*l; 稀疏矩阵 三元组顺序表 转置函数最简单的方法就是row和col对应的值交换,并且row和c