C语言手撕数据结构代码_顺序表_静态存储_动态存储

news2024/9/11 10:05:04

顺序表例题

题目清单:

顺序表基于静态存储习题
1.创建一个顺序表
2.从顺序表中删除第i个元素
3.在第i个元素前插入e
4.从顺序表中删除最小元素,空出的位置由最后一个元素填补
5.在无序顺序表中删除值在s和t之间的所有元素
6.在非递减顺序表中删除值在区间[s,t]的所有元素
7.删除非递减顺序表中的重复元素
顺序表基于动态存储习题
8.顺序表A和B的元素个数分别为m和n,表A升序,表B降序排序,两个表中都不在相同的元素
8.1 将两表合并,两表中的元素存储到表C中(c表保持升序)
8.2 表A前r个元素递增有序,而表A中后n-r个元素递减有序,将表A进行升序排序
9.给定两个非空集合A和B,分别用升序顺序表La和Lb存储,设计算法求解交集
10.给定两个非空集合A和B,分别用升序顺序表La和Lb存储,设计算法求解A-B(差集)
11.设计算法算法逆置顺序表
12.将序列L循环左移动

文章目录

  • 顺序表例题
    • 1.创建一个顺序表
    • 2.从顺序表中删除第i个元素
    • 3.在第i个元素前插入e
    • 4.从顺序表中删除最小元素,空出的位置由最后一个元素填补
    • 5.在无序顺序表中删除值在s和t之间的所有元素
    • 6.在非递减顺序表中删除值在区间[s,t]的所有元素
    • 7.删除非递减顺序表中的重复元素
  • 8.顺序表A和B的元素个数分别为m和n,表A升序,表B降序排序,两个表中都不在相同的元素
    • 8.1 将两表合并,两表中的元素存储到表C中(c表保持升序)
    • 8.2 表A前r个元素递增有序,而表A中后n-r个元素递减有序,将表A进行升序排序
  • 9.给定两个非空集合A和B,分别用升序顺序表La和Lb存储,设计算法求解交集
  • 10.给定两个非空集合A和B,分别用升序顺序表La和Lb存储,设计算法求解A-B(差集)
  • 11.设计算法算法逆置顺序表
  • 12.将序列L循环左移动

1.创建一个顺序表

// 本程序为顺序表模版
#include <iostream>
#define MAX_SIZE 100 //确定顺序表总的空间大小为100
typedef int ElemType;
typedef struct sqlist
{
    ElemType list[MAX_SIZE];
    int length; //记录表长
}sqlist;

void print_list(sqlist a)
{
    for (int i=0; i<a.length; i++) {
        printf("%d->",a.list[i]);
    }
}
int main() {
    sqlist a;
    a.length=0; //初始化单链表表长为7
    for(int i=0;i<=6;i++)
    {
        a.list[i]=i+1;
        a.length++;
    }     //定义一个 1,2,3,4,5,6,7的顺序表
    
    printf("检查顺序表的第一个元素:%d\n当前顺序表的表长为:%d\n",a.list[0],a.length);
    printf("--------打印读入链表-----------\n");
    print_list(a);printf("\n");
    printf("-----------------------------\n");
    return 1;
}

2.从顺序表中删除第i个元素

void delete_i(sqlist &a,int x)
{
    for(int i=x;i<a.length;i++)
    {
        a.list[i-1]=a.list[i];
    }
    a.list[a.length-1]=0;//清空最后一个值的数据
    a.length--;
}

3.在第i个元素前插入e

void insert_i(sqlist &a,int x,int e)
{
    for(int i=a.length;i>=x;i--)
    {
        a.list[i]=a.list[i-1];
    }
    a.list[x-1]=e;
    a.length++;
}

4.从顺序表中删除最小元素,空出的位置由最后一个元素填补

void delete_min(sqlist &a)
{
    int min=100000;
    int flag=0;
    for(int i=0;i<a.length;i++)
    {
        if(a.list[i]<min)
        {
            min=a.list[i];
            flag=i;
        }
    }
    a.list[flag]=a.list[a.length-1];
    a.length--;
}

5.在无序顺序表中删除值在s和t之间的所有元素

void deleteElem(sqlist &a,int s,int t)
{
    int curlength=0;//指向表头的指针,同时也记录着新表的长度
    for(int i=0;i<a.length;i++)
    {
        if(a.list[i]<s||a.list[i]>t)
        {
            a.list[curlength++]=a.list[i];
        }
    }
    a.length=curlength;
}

6.在非递减顺序表中删除值在区间[s,t]的所有元素

从前后找到第一个s,从后往前找到最后一个t,将t后面加入到第一个s前面

//在无序顺序表中删除s和t之间的所有元素
void delete_st(sqlist &a,int s,int t)
{
    int first_s=0;
    int last_t=0;
    int curlength1=0; //记录s前新表长度
    int curlength2=0; //记录t后新表长度
    
    for(int i=0;i<a.length;i++)
    {
        
        if(a.list[i]>=s)
        {
            first_s=i;
            break;
        }else curlength1++;
        
    }
    
    for(int j=a.length-1;j>=0;j--)
    {
        if(a.list[j]<=t)
        {
            last_t=j;
            break;
        }else curlength2++;
    }
    for(int i=first_s,j=last_t+1;j<a.length;j++,i++)
    {
        a.list[i]=a.list[j];
    }
    a.length=curlength1+curlength2;
    printf("length=%d\n",a.length);
}

7.删除非递减顺序表中的重复元素

思想:新表表尾和旧表元素不同时,加入新表

void delete_repeat(sqlist &a)
{
    int curlength=0;
    for(int i=1;i<a.length;i++)
    {
        if(a.list[curlength]!=a.list[i])
        {
            a.list[++curlength]=a.list[i];
        }
    }
    a.length=curlength+1; //长度=下标+1
}

从第8题开始,存储方式改为动态存储


8.顺序表A和B的元素个数分别为m和n,表A升序,表B降序排序,两个表中都不在相同的元素

关于动态存储顺序表

typedef int ElemType;
typedef struct SqList
{
	ElemType *PList;
	int length;
	int listSize;
}SqList;

8.1 将两表合并,两表中的元素存储到表C中(c表保持升序)

void combine(sqList &a,sqlist &b,sqlist &c)
{
    c.length=a.length+b.length;
    c.list=(ElemType *)malloc(sizeof(ElemType)*c.length);
    int curlength=0;
    int index_a=0; //指向a第一个元素的指针
    int index_b=b.length-1; //指向b最后一个元素的指针
    while(index_a<a.length&&index_b>=0)
    {
        if(a.list[index_a]<b.list[index_b])
        {
            //把a加入c
            c.list[curlength++]=a.list[index_a];
            index_a++;
        }else{
            //把b加入c
            c.list[curlength++]=b.list[index_b];
            index_b--;
        }
    }
    //把a或b中的剩余元素加入c中
    while(index_a<a.length)
    {
        c.list[curlength++]=a.list[index_a];
        index_a++;
    }
    while(index_b>=0)
    {
        c.list[curlength++]=b.list[index_b];
        index_b--;
    }
}

8.2 表A前r个元素递增有序,而表A中后n-r个元素递减有序,将表A进行升序排序

一直以最后一个元素为目标,依次的插入进前面的递增序列。不断更新最后一个元素。

void combine_a(sqList &a ,int k)
{
            for(int i=0;i<a.length-1;i++)
            {
                if(a.list[a.length-1]<=a.list[i])
                {
                    int temp=a.list[a.length-1];
                    for(int j=a.length-1;j>i;j--)//包括i在内的所有元素后移
                    {
                        a.list[j]=a.list[j-1];
                    }
                    a.list[i]=temp;
                }
            }
}

9.给定两个非空集合A和B,分别用升序顺序表La和Lb存储,设计算法求解交集

解析:

分别设置两个指针指向两个集合开头,若集合A开头元素小于B集合开头元素,则说明B集合的其他元素都大于A,故A后移一位,反之B后移一位,每当相等的时候,加入交集,同时A和B同时后移一位,直到其中一个表为空时,退出循环。在a表中存储交集

设计样例:
A:1 2 5 7 9 15
B:0 4 5 7 8 9

输出:应为 5 7 9
代码如下:

void jiaoji(sqList &a,sqlist &b)
{
    int curlength=0;
    int index_a=0;
    int index_b=0;
    while (index_a<a.length||index_b<b.length) {
        if(a.list[index_a]<b.list[index_b])
        {
            index_a++;
        }
        else if(a.list[index_a]==b.list[index_b])
        {
            a.list[curlength++]=a.list[index_a];
            index_a++;
            index_b++;
        }else{
            index_b++;
        }
                
    }
    a.length=curlength;
}

10.给定两个非空集合A和B,分别用升序顺序表La和Lb存储,设计算法求解A-B(差集)

解析:

每次将A小于的元素加入进差集当中
设计样例:
A:1 2 5 7 9 15
B:0 4 5 7 8 9

输出:应为 1 2 15
代码如下:

void chaji(sqList &a,sqlist &b)
{
    int curlength=0;
    int index_a=0;
    int index_b=0;
    while (index_a<a.length||index_b<b.length) {
        if(a.list[index_a]<b.list[index_b])
        {
            a.list[curlength++]=a.list[index_a++];
        }
        else if(a.list[index_a]==b.list[index_b])
        {
            index_a++;
            index_b++;
        }else{
            index_b++;
        }
                
    }
    
    while (index_a<a.length) { //如果b短,将a中剩余的元素加入
        a.list[curlength++]=a.list[index_a++];
    }
    a.length=curlength;
    
}

11.设计算法算法逆置顺序表

void reverse(sqList &a)
{
    int low=0;
    int high=a.length-1;
    while (low<high) {
        int temp=a.list[low];
        a.list[low++]=a.list[high];
        a.list[high--]=temp;
    }
}

12.将序列L循环左移动

解析:使用三次逆置

void r_reverse(sqList &a,int low,int high)
{
    while (low<high) {
        int temp=a.list[low];
        a.list[low++]=a.list[high];
        a.list[high--]=temp;
    }
}
void ROL(sqList &a,int r)
{
    r_reverse(a,0,r-1);
    r_reverse(a,r,a.length-1);
    r_reverse(a, 0,a.length-1);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2038616.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux---02---系统目录及文件基本操作命令

课程回顾 操作系统 虚拟机安装 本章重点 Linux系统目录结构 常用命令 熟练区分Linux下各层目录的作用 熟练掌握Linux的常用命令&#xff08;文件命令、时间命令等&#xff09; 一、Linux系统目录结构 1.1 目录结构 /&#xff1a; 根目录&#xff0c;一般根目录下只存放…

KEEPALIVED是什么?以及实现各功能的配置实验

一、高可用集群KEEPALIVED 1.1 KEEPALIVED的出现 LVS ---> HAProxy ---> KEEPALIVED LVS&#xff1a; LVS&#xff1a;四层调度&#xff0c;IP地址&#xff0c;mac地址以及端口对后端进行调度。优点&#xff1a;速度快&#xff0c;对 LVS 的性能要求比较低。缺点&…

离职保密协议是什么?怎么样才是合法的?如何维护公司权益?

“商贾之道&#xff0c;在于诚信&#xff1b;机密之重&#xff0c;犹胜千金。” 在历史的长河中&#xff0c;商业机密一直是商家兴衰成败的关键。 时至今日&#xff0c;随着科技的飞速发展&#xff0c;信息时代的浪潮更是将商业秘密的保护推向了新的高度。 离职保密协议&…

前端(HTML + CSS)小兔鲜儿项目(仿)

前言 这是一个简单的商城网站&#xff0c;代码部分为HTML CSS 和少量JS代码 项目总览 一、头部区域 头部的 购物车 和 手机 用的是 文字图标&#xff0c;所以效果可以和文字一样 购物车右上角用的是绝对定位 logo用的是 h1 标签&#xff0c;用来提高网站搜索排名 二、banne…

简单的class.getResource与classLoader.getResource区别

简单的getClass().getResource()与ClassLoader.getResource()区别 1.简介 我们在springboot项目中&#xff0c;如果要获取到自己配置的资源或者配置类信息一般会用到Class.getResource()或ClassLoader.getResource()&#xff0c;这两种方式在使用的过程中很容易混淆&#xff…

echarts格式化图例回调函数返回对象

使用返回的对象可以自定义图例显示 formatter:function(obj){var label obj.seriesName "<br/>" obj.marker obj.name ":" obj.value "宗" "<br/>" "占比" obj.percent "%";return label…

四川大型数字媒体产业园区在哪里,有推荐吗?

四川省作为中国西南地区的经济和文化重镇&#xff0c;数字媒体产业的发展取得了令人瞩目的成绩。以下是四川省排名前十的数字媒体产业园&#xff0c;这些园区在推动科技创新和区域经济发展方面发挥了重要作用。 1、 国际数字影像产业园 位置&#xff1a;成都市金牛区 特点&…

触摸屏接口设置-洋桃百科

触摸屏接口设置-洋桃百科 电路设计 ​​ 触摸屏的组成&#xff1a; PCB板层&#xff1a;是电子设备中用于支撑和连接电子元件的基板。 显示层&#xff1a;是LCD触摸屏的核心部分&#xff0c;负责生成视觉图像。它由以下部分组成&#xff1a; 液晶层&#xff1a;包含液晶材料…

框架盛行,还记得原生JS如何获取表单数据吗?

你好同学&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏和关注&#xff01;个人知乎 在这个前端框架遍地开花的时代&#xff0c;同学们常常被React、Vue、Angular等现代JavaScript框架的便捷性和高效性所吸引。那么多年过去&#xff0c;你还记得原生JS是如何获取表单数据的吗…

论文分享|MLLMs中多种模态(图像/视频/音频/语音)的tokenizer梳理

本文旨在对任意模态输入-任意模态输出 (X2X) 的LLM的编解码方式进行简单梳理&#xff0c;同时总结一些代表性工作。 注&#xff1a;图像代表Image&#xff0c;视频代表Video&#xff08;不含声音&#xff09;&#xff0c;音频代表 Audio/Music&#xff0c;语音代表Speech 各种…

docker数据卷和资源控制

目录 数据卷 实现数据卷 宿主机和容器之间进行数据共享 容器与容器之间进行数据共享 容器互联 docker容器的资源控制 cpu 1.设置cpu资源控制&#xff08;比重&#xff09; 2. 设置cpu的资源占用比&#xff08;权重&#xff09; 3.设置容器绑定cpu 内存 1.内存限制 …

Docker搭建Minio容器

Docker搭建Minio容器 前言 在上一集我们介绍了分布式文件存储行业解决方案以及技术选型。最终我们决定选用Minio作为分布式文件存储。 那么这集我们就在Docker上搭建Minio容器即可。 Docker搭建Minio容器步骤 创建Minio文件目录 我们选择创建/minio/data目录 修改目录权…

系统编程 day11 进程(线程)3

fork函数的总结&#xff1a; 总结对进程学习之中的回收函数wait wait函数&#xff1a; 1.获取子进程的退出状态 2.回收资源------会让僵尸态的子进程销毁 注&#xff1a;1.wait函数本身是一个阻塞操作&#xff0c;会使调用者阻塞 2.父进程要获得子进程的退出状态 子进程&…

解决STM32G474单片机_HAL_UART_Transmit_IT()连续发送之问题

在使用STM32G474单片机的HAL库时&#xff0c;使用“在中断服务程序中发送数据”和“在中断程序中接收数据”&#xff0c;是一种很常用的方法&#xff0c;特别是RS485通讯中。首次使用&#xff0c;肯定会踩坑。要么出现第一个数据收不到&#xff0c;要么出现连续发送&#xff0c…

米联客-FPGA程序设计Verilog语法入门篇连载-02 Verilog语法_基本设计方法

软件版本&#xff1a;无 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用所有系列FPGA 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑&#xff01; 1概述 本节主要讲解Verilog的基本设…

【屏驱MCU】增加自定义分区指南

说明&#xff1a;本文主要给出基于该款 点屏 MCU。增加自定义分区指南 屏驱MCU系列文章 【屏显MCU】多媒体接口总结&#xff08;一&#xff09; 【DVP接口】0v5640的DVP接口设计分析&#xff08;硬件&#xff09; 【DVP接口】0v5640的DVP接口设计分析&#xff08;软件&#xff…

CCF-GESP8级考试—图论算法及综合应用(最小生成树)

&#x1f349;1 最小生成树的概念 1.1 连通图 &#x1f388; 连通图用于描述图中顶点之间是否存在路径相连。一个无向图中&#xff0c;如果从图中的任意一个顶点出发&#xff0c;都可以通过边的连接到达图中的任意其他顶点&#xff0c;则该图被称为连通图。 连通图的性质&…

为何众多卖家都选择入驻亚马逊VC?有什么优势?——WAYLI威利跨境助力商家

众多卖家选择入驻亚马逊VC&#xff08;Vendor Central&#xff09;&#xff0c;主要是因为VC平台为卖家提供了一系列显著的优势。VC使卖家与亚马逊建立直接供应关系&#xff0c;提升曝光率和销售机会。作为全球领先电商平台&#xff0c;亚马逊拥有庞大用户群和完善物流体系&…

C#窗体自定义快捷操作键的实现 - 开源研究系列文章

这次想到应用程序的窗体的快捷操作键的使用的问题。 上次发布过一个快捷键的例子(https://www.cnblogs.com/lzhdim/p/18342051)&#xff0c;区别在于它是操作系统全局注册的热键&#xff0c;如果其它应用程序注册了对应的热键&#xff0c;那就会失效。此例子是对某个窗体里的按…

AI驱动人才社区革新:智能化探索与实践

一、引言&#xff1a;AI赋能人才新生态 在21世纪的数字化浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;技术以其强大的数据处理能力、学习优化算法及创新应用模式&#xff0c;正深刻地改变着各行各业的面貌&#xff0c;人才管理领域亦不例外。传统的人才社区&#xf…