数据结构常用常考经典习题【按十大专题总结】

以下都是小旭大一下学期在家上网课的时候,根据教授所出的试题,一份份手写搞成图片粘进word里面的,现在免费做一个小汇总,主要涵盖了一些简单的介绍和10次线下作业及2次思维训练,涵盖了几乎所有的经典习题类型,方便大家借鉴交流~

在这里插入图片描述

下面小旭先简单地介绍下数据结构的定义、研究对象和意义
在这里插入图片描述

一、定义: 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。

二、研究对象:
1.数据的逻辑结构: 指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关。

逻辑结构包括: 集合结构(数据结构中的元素之间除了"同属一个集合" 的相互关系外,别无其他关系) 线性结构(数据结构中的元素存在一对一的相互关系) 树形结构(数据结构中的元素存在一对多的相互关系)
图形结构(数据结构中的元素存在多对多的相互关系)

2.数据的物理结构: 指数据的逻辑结构在计算机存储空间的存放形式。

数据的物理结构: 数据结构在计算机存储器中的具体实现,是逻辑结构的表示(又称存储映像),它包括数据元素的机内表示和关系的机内表示。由于具体实现的方法有顺序、链接、索引、散列等多种,所以,一种数据结构可表示成一种或多种存储结构。

数据元素的机内表示(映像方法): 用二进制位(bit)的位串表示数据元素。通常称这种位串为节点(node)。当数据元素有若干个数据项组成时,位串中与各数据项对应的子位串称为数据域(data
field)。因此,节点是数据元素的机内表示(或机内映像)。

关系的机内表示(映像方法): 数据元素之间的关系的机内表示可以分为顺序映像和非顺序映像,常用两种存储结构:顺序存储结构和链式存储结构。顺序映像借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系;非顺序映像借助指示元素存储位置的指针(pointer)来表示数据元素之间的逻辑关系。

3.数据结构的运算(这里就不一一赘述啦)

三、意义: 在这里插入图片描述

现在终于可以切入主题内容啦!
在这里插入图片描述

第一次线下作业【数据及其结构】

【简单定义、数据的两种存储方式、ADT三元组、二分归并排序的公式推导及复杂度求解】
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

typedef int Status; 
typedef int ElemType; 
typedef ElemType *Triplet;
Status InitTriplet(Triplet &T,ElemType v1,ElemType v2,ElemType v3){ 
    T=(ElemType *)malloc(3 *sizeof(ElemType)); 
    if(!T) exit(OVERFLOW); 
    T[0]=v1; 
    T[1]=v2; 
    T[2]=v3; 
    return OK; 
}

在这里插入图片描述

第二次线下作业【表】

【顺序表的插入删除平均移动元素次数、单循环链表删除节点的操作、各表的存储方式】

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第三次线下作业【堆栈】

【已知进栈顺序求出栈顺序、定义顺序栈的数据类型】
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

SqStack *s   
(s->top)-(s->base)    
s->top    
(s->top)++     
1

第四次线下作业【队列】

【循环队列的优点及判空满、单循环链表表示链队时头尾指针出入队的操作时间、定义顺序队列的代码补充】
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第五次线下作业【字符串】

【求串的next函数值、判断字符串是否对称】
在这里插入图片描述
在这里插入图片描述

第六次线下作业【矩阵&广义表】

【求矩阵的向量copt值、求广义表深度&长度&表头表尾、用head()&tail()函数取出LS中原子的运算命令组合】
在这里插入图片描述
在这里插入图片描述

第七次线下作业【树】

【求叶子节点、画二叉树、画哈夫曼树、求二叉树的遍历顺序】
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

第八次线下作业【图】

【连通图、无向图、连通分量、最小生成树(Prim和Krucskal算法)】
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第九次线下作业【散列/哈希】

【求二叉排序树、求散列(在等概率下)的平均查找长度】
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第十次线下作业【排序】

【希尔排序、快速排序、堆排序、二路归并排序、置换选择排序】
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第一次思维训练【合并新闻列表】

在这里插入图片描述
在这里插入图片描述

第二次思维训练【合并有序线性表】

在这里插入图片描述
流程图:
在这里插入图片描述
代码:

#include <bits/stdc++.h>
#include <malloc.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define null 0
using namespace std;
int i,j,k,n,m,t,status,a[10000],b[10000];

typedef struct {
    int *elem,length,size; 
}SqList; 

int ListLength(SqList SL) {
    if(SL.elem!=null)  return SL.length;
    else  return 0;
}

void  GetElem(SqList SL,int i,int &e) {
    if(i<0||i>ListLength(SL))   return ;
    e=SL.elem[i-1];
}

int InitList(SqList &SL) {
    SL.elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
    if(SL.elem==null)   return 0;
    SL.length=0;
    SL.size=LIST_INIT_SIZE;
    return 1;
}

//插入操作
int ListInsert(SqList &SL,int i,int e) {
    int *newbase,*p,*q; 
    int len=ListLength(SL);
    if(i<1||i>len+1)   return 0;
    if(SL.length>=SL.size)
    {
        newbase=(int *)realloc(SL.elem,(SL.size+LISTINCREMENT)*sizeof(int)); 
        if(newbase==null)   return 0;
        SL.elem=newbase;
    }
    p=&SL.elem[i-1];
    q=&SL.elem[len-1];
    for(;q>=p;q--)  *(q+1)=*q;
    *p=e; SL.length++;
} 

void Merg(SqList La,SqList Lb,SqList &Lc) {
    InitList(Lc); 
    i=j=1;   
    k=0;
    La.length = ListLength(La);
    Lb.length = ListLength(Lb); 
    while((i<=La.length)&&(j<=Lb.length))
    {
        GetElem(La,i,a[i]);
        GetElem(Lb,j,b[j]);
        if(a[i]<=b[j]) {
             ListInsert(Lc,++k,a[i]); ++i;}
        else 
             {ListInsert(Lc,++k,b[j]); ++j;} 
    }
    while(i<=La.length) {
        GetElem(La,i,a[i]); 
        ListInsert(Lc,++k,a[i]);
        i++;
    }
    while(j<=Lb.length) {
        GetElem(Lb,j,b[j])A; 
        ListInsert(Lc,++k,b[j]);
        j++;
    }
}//MergeList

void traverse(SqList SL) {
    for(i=0; i<SL.length; i++)
    cout<<SL.elem[i]<<" ";
}

int main()
{
    SqList La,Lb,Lc;
    status=InitList(La);
    if(status==0)
        cout<<"SqList Init failed!";
    status=InitList(Lb);
    if(status==0)
        cout<<"SqList Init failed!";
    status=InitList(Lc);
    if(status==0)
        cout<<"SqList Init failed!";  
    cin>>m>>n;
    for(i=1; i<=m; i++) {
        cin>>t;
        ListInsert(La,i,t);
    }
    for(i=1; i<=n; i++) {
        cin>>t;
        ListInsert(Lb,i,t);
    }
    traverse(La);
    cout<<endl;
    traverse(Lb);
    Merg(La,Lb,Lc);
    traverse(Lc);
    return 0;
}

运行结果:
在这里插入图片描述
【大家在掌握理论知识之后,可以结合下方链接的文章巩固应用所学的知识,进入实战演练,明确不同篇章的具体要求,在自己的编码能力上更上一个层次 😃】
手把手教你写数据结构八大实验报告

  • 14
    点赞
  • 155
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

米莱虾

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

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

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

打赏作者

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

抵扣说明:

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

余额充值