查找元素x,若x存在,则与其后继交换,否则将x插入,使顺序表有序

2024-05-01 09:32

本文主要是介绍查找元素x,若x存在,则与其后继交换,否则将x插入,使顺序表有序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#include<stdio.h>
#define LIST_INIT_SIZE 6
#define LISTINCREMENT 10
typedef int ElemType;
typedef struct{ElemType *elem;int length;int listsize;
}SqList;void InitSqList(SqList *L);//初始化顺序表
void CreateSqList(SqList *L, ElemType *arr, int n);//给予顺序表初始数据
void ShowSqList(SqList *L);//输出顺序表数据//二分法查找x,找到则返回元素索引,找不到则返回不大于x的最大元素索引的相反数
int SearchByElem(SqList *L, ElemType x);
//第i个数据之前插入x
void InsertByIndex(SqList *L, int i, ElemType x);
//交换数据值
void swap(ElemType *x, ElemType *y);
//查找元素x,若x存在,则与其后继交换,否则将x插入,使顺序表有序
void SearchSwapInsert(SqList *L, ElemType x);int main()
{SqList L;ElemType arr[6] = { 1, 2, 3, 5, 7, 6 };InitSqList(&L);CreateSqList(&L, arr, 6);printf("初始数据列表:");ShowSqList(&L);printf("\n");printf("执行查找交换插入算法,数据为:%d\n",7);SearchSwapInsert(&L, 7);ShowSqList(&L);printf("执行查找交换插入算法,数据为:%d\n", 4);SearchSwapInsert(&L, 4);ShowSqList(&L);getchar();return 0;
}void InitSqList(SqList *L)
{L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));L->length = 0;L->listsize = LIST_INIT_SIZE;
}void CreateSqList(SqList *L, ElemType *arr, int n)
{int i;if (n <= LIST_INIT_SIZE){for (i = 0; i < n; i++){L->elem[i] = arr[i];}L->length = n;}else{printf("插入失败,数据个数应不大于 %d", LIST_INIT_SIZE);}
}void ShowSqList(SqList *L)
{int i;for (int i = 0; i < L->length; i++){printf(" %d ", L->elem[i]);}printf("\n");
}//二分法查找x,找到则返回元素索引,找不到则返回不大于x的最大元素索引
int SearchByElem(SqList *L, ElemType x)
{int high = L->length - 1;int low = 0;int mid;while (low <= high){mid = (high + low) / 2;if (L->elem[mid] == x){return mid;}else if (x < L->elem[mid]){high = mid - 1;}else{low = mid + 1;}}//high为小于x元素集合中的最大值的索引return -high;
}//第i个数据之前插入x
void InsertByIndex(SqList *L, int i, ElemType x)
{if (i<1||i>L->length+1){printf("位置不合法,插入失败!");return;}if (L->length >= L->listsize){ElemType *enew = (ElemType *)realloc(L->elem, (LISTINCREMENT + L->listsize) * sizeof(ElemType));L->elem = enew;L->listsize += LISTINCREMENT;}ElemType *p = &(L->elem[i - 1]);//待插入的位置ElemType *q = &(L->elem[L->length - 1]);//q指向最后一个元素for (; p <= q; q--){*(q + 1) = *q;}*p = x;L->length++;
}void swap(ElemType *x, ElemType *y)
{ElemType t = *y;*y = *x;*x = t;
}void SearchSwapInsert(SqList *L, ElemType x)
{int k;if ((k = SearchByElem(L, x)) >= 0){swap(&(L->elem[k]), &(L->elem[k + 1]));}else{InsertByIndex(L, -k + 2, x);}
}

这篇关于查找元素x,若x存在,则与其后继交换,否则将x插入,使顺序表有序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/951327

相关文章

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

解决mysql插入数据锁等待超时报错:Lock wait timeout exceeded;try restarting transaction

《解决mysql插入数据锁等待超时报错:Lockwaittimeoutexceeded;tryrestartingtransaction》:本文主要介绍解决mysql插入数据锁等待超时报... 目录报错信息解决办法1、数据库中执行如下sql2、再到 INNODB_TRX 事务表中查看总结报错信息Lock

MySQL中SQL的执行顺序详解

《MySQL中SQL的执行顺序详解》:本文主要介绍MySQL中SQL的执行顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql中SQL的执行顺序SQL执行顺序MySQL的执行顺序SELECT语句定义SELECT语句执行顺序总结MySQL中SQL的执行顺序

C#实现查找并删除PDF中的空白页面

《C#实现查找并删除PDF中的空白页面》PDF文件中的空白页并不少见,因为它们有可能是作者有意留下的,也有可能是在处理文档时不小心添加的,下面我们来看看如何使用Spire.PDFfor.NET通过C#... 目录安装 Spire.PDF for .NETC# 查找并删除 PDF 文档中的空白页C# 添加与删

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

SpringBoot中配置文件的加载顺序解读

《SpringBoot中配置文件的加载顺序解读》:本文主要介绍SpringBoot中配置文件的加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot配置文件的加载顺序1、命令⾏参数2、Java系统属性3、操作系统环境变量5、项目【外部】的ap