【数据结构基础应用】【顺序表】

代码参考《妙趣横生的算法.C语言实现》、《剑指OFFER 名企面试官精讲典型编程题 第2版》等

文章目录

  • 前言
    • 1、合并两个顺序表


前言

本章总结在看书过程中的一些关于顺序表的算法题并可能含有一些自己的一些疑问。题目数量不定,随阅历增加而增加;


1、合并两个顺序表

题目要求:

有两个顺序存储的线性表,分别存放了一些整数数据,每个顺序表中存放的数据从小到大排列。写一个程序,将两个表合并,生成一个新的顺序表,里面的顺序仍然按照从小到大排列。
例如:
list1:1,2,4,8,10
list2:3,9,11
合并之后的list3:1,2,3,4,8,9,10,11

提示:应该使用动态创建这个顺序表,这样list3的长度才可以根据list1和list2的长度动态调整。
要实现两个顺序按值归并,最终仍保持数据的从小到大递增排序,可以设置两个指针p1、p2分别指向两个待合并的顺序表list1和list2,设置指针p3指向新表list3用来向list3中存放数据,然后逐一比较p1和p2指向的内容 ,将其中较小的那个放到p3指向的list3的存储单元,然后将较小的那个指针+1.使其指向表的下一个数据,同时p3也要自动+1。重复上述操作,直到list1,list2中某一个顺序表的内容被全部归并到list3中.最后再将未完全归并的顺序表中的后续内容整体移至list3中。

代码:

#include <stdio.h>
#include <stdlib.h>
#include "malloc.h"
#include "conio.h"
typedef int ElemType;typedef struct {int* elem;int length;int listsize;
}Sqlist;//初始化顺序表
void InitSqlist(Sqlist *L,int size)
{L->elem = (int*)malloc(sizeof(ElemType)*size);			//在堆内存上开辟空间,并将地址指针传给elemif (!L->elem){printf("顺序表内存开辟失败");exit(0);}L->length = 0;								//最开始的表长0L->listsize = size;
}//向顺序表中插入元素
//向顺序表L第i个位置插入元素item
void InsertElem(Sqlist* L,int i, ElemType item)
{//追加内存后的新的基址、指向插入位置的指针、移动数据的指针中间变量ElemType* base, * insertPtr, * p;if (i<1 || i>L->length + 1)		{printf("非法插入");exit(0);}if (L->length >= L->listsize)		//顺序表的空间不够,追加内存{base = (ElemType*)realloc(L->elem, (L->listsize + 10) * sizeof(ElemType));		//将追加内容后的内存首地址传给baseL->elem = base;L->listsize = L->listsize + 100;}insertPtr = &(L->elem[i-1]);		//指针指向插入位置for (p = &L->elem[L->length - 1];p >= insertPtr;p--){//移动顺序表中数据*(p+1) = *p;}*insertPtr = item;				//插入数据元素L->length++;
}
//销毁顺序表
void DestroySqlist(Sqlist* list)
{int* p = list->elem;free(p);list->elem = NULL;list->length = 0;list->listsize = 0;
}
//两个顺序表内容的合并,返回一个新的list
Sqlist MergeList(Sqlist list1, Sqlist list2)
{//将list1和list2的内容合并到list3并返回int* p1, * p2, * p3, * p1_last, * p2_last;Sqlist list3;p1 = list1.elem;		//p1指向list1第一个元素p2 = list2.elem;		//p2指向list2第一个元素//初始化list3,其长度为list1 list2 长度之和InitSqlist(&list3,list1.length+list2.length);p3 = list3.elem;		//p3指向list3第一个元素p1_last = list1.length + list1.elem - 1;	//p1_last指向list1的表尾p2_last = list2.length + list2.elem - 1;	//p2_last指向list2的表尾//实现合并while (p1<=p1_last && p2<=p2_last)		//当list1与list2中有一个list被遍历完{if (*p1 <= *p2)	//当p1指向的元素小于p2指向的元素{*p3 = *p1;p3++;p1++;}else{*p3 = *p2;p3++;p2++;}list3.length++;}//将list1或者list2中剩余元素并入list3中if (p1 <= p1_last)		//p1有剩余{while (p1 <= p1_last){*p3 = *p1;p3++;p1++;list3.length++;}}else{while (p2 <= p2_last){*p3 = *p2;p3++;p2++;list3.length++;}}//当搬移完成后,返回list3return list3;
}
//测试程序
int main()
{Sqlist list1, list2, list3;		//实例化3个顺序表int n, i;					//存放list长度中间变量、累加器ElemType e;					//插入元素中间变量printf("请输入list1的长度\n");scanf("%d",&n);InitSqlist(&list1,n);printf("请输入list1的元素\n");for (i=1;i<=n;i++){scanf("%d",&e);InsertElem(&list1,i,e);}printf("请输入list2的长度\n");scanf("%d", &n);InitSqlist(&list2, n);printf("请输入list2的元素\n");for (i = 1;i <= n;i++){scanf("%d", &e);InsertElem(&list2, i, e);}list3 = MergeList(list1,list2);printf("输出合并后的结果\n");for (i = 0;i < list3.length;i++){printf("%d ",list3.elem[i]);			//这里%d根据ElemType类型来进行修改}//销毁list,释放内存DestroySqlist(&list1);DestroySqlist(&list2);DestroySqlist(&list3);_getche();return 0;
}

效果:
在这里插入图片描述

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

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

相关文章

html上下滚动切换顶端tab,jQuery实现Tab菜单滚动切换的方法

本文实例讲述了jQuery实现Tab菜单滚动切换的方法。分享给大家供大家参考。具体如下&#xff1a;这是一款jQuery实现让你的Tab菜单滚动的代码,先运行一下看看效果咋样?是不是超不错,让你的网页变得灵动起来,不再静止,学习jquery的朋友也可作为范例来参考吧.运行效果截图如下&am…

[转载]十四步实现拥有强大AI的五子棋游戏

又是本人一份人工智能作业……首先道歉&#xff0c;从Word贴到Livewrter&#xff0c;好多格式没了&#xff0c;也没做代码高亮……大家凑活着看……想做个好的人机对弈的五子棋&#xff0c;可以说需要考虑的问题还是很多的&#xff0c;我们将制作拥有强大AI五子棋的过程分为十四…

Java BigDecimal plus()方法与示例

BigDecimal Class plus()方法 (BigDecimal Class plus() method) Syntax: 句法&#xff1a; public BigDecimal plus();public BigDecimal plus(MathContext ma_co);plus() method is available in java.math package. plus()方法在java.math包中可用。 plus() method is used…

爬虫项目(二)---采集从03月02号以来的世界各国疫情数据

该内容出自黑马程序员教程 采集从03月02号以来的世界各国疫情数据 步骤&#xff1a; Ⅰ&#xff0c;重构项目(一)的代码&#xff0c;以提高扩展性 把功能封装到一个类中每一个小功能变成一个方法通过run方法启动爬虫 import requests import re import json from bs4 impor…

【原创】StreamInsight查询系列(二十)——查询模式之检测间隙事件

上篇文章介绍了查询模式中如何检测异常事件&#xff0c;这篇博文将介绍StreamInsight中如何检测间隙事件。 测试数据准备 为了方便测试查询&#xff0c;我们首先准备一个静态的测试数据源&#xff1a;// 创建数据源&#xff0c;要注意的是4:16和4:30之间存在的事件间隙 var sou…

git 项目过大问题解决

当项目过大时&#xff0c;git clone时会出现error: RPC failed; HTTP curl The requested URL returned error: Gateway Time-out的问题 解决方法很简单&#xff0c;在git clone时加上--depth1即可解决 克隆的项目只包含最近的一次commit的一个分支&#xff0c;体积很小&#x…

java bitset_Java BitSet hashCode()方法及示例

java bitsetBitSet类hashCode()方法 (BitSet Class hashCode() method) hashCode() method is available in java.util package. hashCode()方法在java.util包中可用。 hashCode() method is used to retrieve hash code for this bit set (BitSet). hashCode()方法用于检索此位…

【数据结构基础应用】【查找和排序算法】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、顺序查找2、折半查找3、直接插入排序4、选择排序5、冒泡排序6、希尔排序7、快速排序8、堆排序9、排序算法性能比较10、所有算法的code&#xff08;C语言&#xff09;前言 本章总结查找和排序算法&#xff1a;顺序查找、折…

MarshalHelper

1 public class MarshalHelper2 {3 /// <summary>4 /// 结构体转byte数组5 /// </summary>6 /// <param name”structObj”>要转换的结构体</param>7 /// <returns>转换后的byte数组</returns&g…

深入浅出SharePoint——InvokeWorkflow的妙用

应用场景&#xff1a;在Parallel Activity中使用InvokeWorkflow来达到间接关闭并行分支的功能。 TestInvokeWorkflow方法用于启动监听工作流。endinvoke方法用户关闭启动的监听工作流实例。 private void TestInvokeWorkflow(object sender, EventArgs e) { SPWeb web SPConte…

爬虫项目(三)---采集最近一日全国各省疫情数据

该内容出自黑马程序员教程 采集最近一日全国各省疫情数据 当然&#xff0c;数据来源仍然是丁香园新型冠状病毒肺炎疫情实时动态首页 url&#xff1a;https://ncov.dxy.cn/ncovh5/view/pneumonia 思路&#xff1a;首先需要先确定全国各省疫情数据的位置 全国各省份的疫情数据…

计算机专业博士后排名,排名丨计算机专业领域TOP10,性价比超高!

原标题&#xff1a;排名丨计算机专业领域TOP10&#xff0c;性价比超高&#xff01;相信各位家长、同学已经看过太多专业的排名&#xff0c;我问过很多理科生将来想学什么专业&#xff0c;听到频率最高的还是计算机专业。似乎大家都知道&#xff0c;学计算机是比较挣钱的&#x…

python set |_Python事件类| set()方法与示例

python set |Python Event.set()方法 (Python Event.set() Method) set() is an inbuilt method of the Event class of the threading module in Python. set()是Python中线程模块的Event类的内置方法。 When the set() method is called, the internal flag of that event c…

js 命名规范

转载于:https://www.cnblogs.com/zjx2011/p/3165043.html

爬虫项目(四)---采集从01月22日以来全国各省疫情数据

采集从03月02日以来全国各省疫情数据 当然&#xff0c;数据来源仍然是丁香园新型冠状病毒肺炎疫情实时动态首页 url&#xff1a;https://ncov.dxy.cn/ncovh5/view/pneumonia 分析 确定01月22日以来全国各省疫情数据的URL 由项目(三)可以获取全国各省疫情数据点击可下载&…

Install PHP and Apache

http://cn.php.net/manual/en/install.unix.apache2.php Install Apache first, then sudo apt-get install libxml2-dev sudo apt-get install libmysqlclient16-dev Then, configure PHP转载于:https://www.cnblogs.com/songsiyao/archive/2011/09/15/2178087.html

纠错码trick和数据压缩trick

纠错码和压缩算法是同一枚硬币的两面。 两者都来自于对冗余的想法。 纠错码被视为向消息或文件中添加冗余的原则性方法。而压缩算法正好相反&#xff0c;他们会从消息或文件中移除冗余。 压缩和纠错并不是彼此抵消的&#xff0c;相反&#xff0c;好的压缩算法会移除抵消冗余&am…

计算机专业理论,计算机专业综合理论.doc

计算机专业综合理论2010年南京市单招班教学调研测试卷(二)计算机专业综合理论命题人&#xff1a;管荣平 陈高峰 戴则萍 吴有俊本试卷分第一卷(单项选择题、判断题)和第二卷(填空题、程序阅读题、编程题和计算作图题)两部分。第一卷1至2页&#xff0c;第二卷3至6页。两卷满分300…

网站上flv,MP4等格式的视频文件播放不出来的解决办法

在做一个网站时&#xff0c;发现视频文件&#xff0c;比如flv&#xff0c;MP4格式在本地可以正常的播放&#xff0c;但是传到了开发机器上&#xff0c;就不行了。播放器的文件地址是对的&#xff0c;就是一直没有反应。 经过长时间的实验&#xff0c;发现问题在与iis的设置问题…

centos6 更新数据源

尝试了很多,还是163源最舒服. 编辑yum配置文件(163源)&#xff1a; #vi /etc/yum.repos.d/CentOS-Base.repo [base] nameCentOS-$releasever - Base mirrorlisthttp://mirrorlist.centos.org/?release$releasever&arch$basearch&repoos #baseurlhttp://mirror.centos…