首页 > 其他分享 >顺序表

顺序表

时间:2024-10-17 21:47:57浏览次数:3  
标签:slist 顺序 return int seqlist List printf

ADT List is
operations

List SetNullList(void) //创建一个空的线性表

int IsNull(List list) //判断线性表list是否为空

int InsertPre(List list, position p, Datatype x) //在第p个位置之前插入元素x

int InsertPost(List list, position p, Datatype x) //在第p个位置之后插入元素x

int DelIndex(List list, position p) //删除线性表中第p个位置的元素

int DelValue(List list, Datatype x) //删除线性表中值为x的元素

int LocateIndex(List list, Datatype x) //在线性表中查找值为x的元素位置

int LocatePos(List list, Datatype x) //在线性表中查找值为x的元素在内存中的位置

End ADT List

点击查看详细代码
//SetConsoleOutputCP(CP_UTF8);
#include <stdio.h>
#include <stdlib.h>

typedef int DataType;
struct List
{
	int max;
	int n;
	DataType* elem;
};
typedef struct List* SeqList;

SeqList SetNullList_seq(int m)
{
	SeqList slist = (SeqList)malloc(sizeof(struct List));
	if (slist != NULL)
	{
		slist->elem = (DataType*)malloc(sizeof(DataType) *m);
		if (slist->elem){
			slist->max=m;
			slist->n = 0;
			return slist;
		}
		else
			free(slist);
	}
	printf("out of space!\n");
	return NULL;
}

int IsNullList(SeqList slist)
{
	return(slist->n == 0);
}

int InsertPre_seq(SeqList slist, int p, DataType x)
{
	int q;
	if (slist->n >= slist->max) {/*顺序表满溢出*/
		printf("overflow");
		return(0);
	}
	if(p<0 || p>slist->n){//不存在下标为p的元素
		printf("not exist!\n");
		return(0);
	}
	for (q = slist->n - 1; q >= p; q--)//插入位置以及之后的元素后移
		slist->elem[q + 1] = slist->elem[q];
	slist->elem[p] = x;//插入元素x
	slist->n = slist->n + 1;//顺序表长度加1
	return(1);
}

int DelIndex_seq(SeqList slist, int p)//删除下标为p的元素
{
	int q;
	if(p<0 || p>=slist->n){//不存在下标为p的元素
		printf("Not exist\n");
		return 0;
	}
	for (q = p; q<slist->n; q++) {//p位置之后的元素向前移动
		slist->elem[q] = slist->elem[q + 1];
	}
	slist->n = slist->n - 1;//顺序表长度减1
	return 1;
}

void print(SeqList slist) //输出顺序表
{
	int i;
	for (i = 0; i < slist->n; i++) //依次遍历顺序表,并输出
		printf("%d ", slist->elem[i]);
	printf("\n");
}

int LocateIndex_seq(SeqList slist, int x)//查找值为x的元素,返回元素所在下标
{
	int q;
	for (q = 0; q < slist->n; q++)
	{
		if (slist->elem[q] == x)//查找成功,返回对应的下标
			return q;
	}
	return -1;//查找失败,返回-1
}

//二分查找(检索):降序或升序
int binsearch(SeqList slist, int key)
{
	int index = 1; int mid;
	int low = 0; int high = slist -> n - 1;
	while (low <= high)
	{
		mid = (low + high) / 2;
		if (slist->elem[mid] == key) {
			printf("找到,共进行%d次比较\n", index);
			printf("要找的数据%d在位置%d上\n", key, mid);
			return 1;
		}
		else if (slist->elem[mid] > key)
			high = mid - 1;
		else low = mid + 1;
		index++;
	}
	printf("没有找到,共进行%d次比较\n", index - 1);
	printf("可将次数据插入到位置%d上\n", low);
	return -1;
}

int main()
{	
	SeqList seqlist;
	int i, x;
	seqlist = SetNullList_seq(12);
	printf("%d", IsNullList(seqlist));
	printf("输入顺序表的元素:");
	for (i = 0; i < 6; i++)
	{
		scanf_s("%d", &x);
		InsertPre_seq(seqlist, i, x);//通过插入建立顺序表
	}
	printf("顺序表是否为空,1为空,0为非空:%d\n", IsNullList(seqlist));
	printf("当前顺序表的元素是:");
	print(seqlist);//输出顺序表
	DelIndex_seq(seqlist, 3);//删除下标为3的元素
	printf("删除下标为3的元素后的顺序表:");
	print(seqlist);//输出顺序表
	InsertPre_seq(seqlist, 5, 99);//在下标5位置之前插入99
	printf("在下标2位置之前插入99后的顺序表:");
	print(seqlist);//输出顺序表
	printf("查找值为99,如果查找成功,返回对应下标,查找失败,返回-1:%d\n", LocateIndex_seq(seqlist, 99));
	printf("二分法查找值为3,找到为1,找不到为-1:%d\n",binsearch(seqlist, 3));
}




标签:slist,顺序,return,int,seqlist,List,printf
From: https://www.cnblogs.com/absolutethree/p/18473195

相关文章

  • 05 线性结构——队列(特性、入队与出队、顺序队列和链式队列、顺序队列的“假溢出”问
    目录1队列的基本概念1.1定义1.2队列的组成部分1.3空队列1.4操作流程 1.4.1添加元素(入队)1.4.2删除元素(出队)2队列的存储结构2.1顺序队列2.2链式队列3 顺序队列中的“假溢出”问题及解决方案3.1问题描述3.2解决方案方法1:元素左移法方法2:循环队列4......
  • 数据结构--顺序表
    简介:这是顺序表的数据结构以C/C++语言实现,编译器为VS2022,如有不对的地方欢迎大家在评论区里讨论在其中我们要用到如下头文件:#include"stdio.h"#include"stdlib.h"简单宏定义一些类型,宏定义的内容可以根据自身需求进行更换:#defineMaxsize50 //静态顺序表的最大长度#def......
  • Gateway过滤器执行顺序以及跨域问题
    执行顺序请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执......
  • 顺序查找、二分查找
    一、基本查找(顺序查找):从前往后,挨个查找二、二分查找(折半查找)1、前提条件:数组中的数据必须是有序的。2、核心思想:每次排除一半的数据,查询数据的性能明显提高极多。举例:从一组数据中,找出79。第一步:从小到大排序。第二步:此时目标值79小于81,因此要将right移到mid左侧。......
  • ArrayList和顺序表(下)
    1.Java本身提供的ArrayList    在ArrayList和顺序表(上)那一节里面,我们自己实现了ArrayList的底层大部分代码,在这个基础上,我们就可以开始来了解Java本身提供的ArrayList.    1.1ArrayList的三种构造方法        方法解释ArrayList()无参构造A......
  • element 穿梭框el-transfer 实现上下移动选中的数据顺序
    代码实现<template><div><el-buttontype="primary"size="default"@click="upDown('up')">up</el-button><el-buttontype="primary"size="default"@click="upDo......
  • JavaScript中的流程控制(顺序结构、分支结构、循环结构)
    流程控制1.概念在一个程序执行的过程中,各条代码的执行顺序对程序的结果是有直接影响的,很多时候要通过控制代码的执行顺序来实现我们完成的功能简单的理解:流程控制就是控制代码,按照一定的结构顺序来执行流程控制的分类:顺序结构分支结构循环结构2.顺序流程控......
  • MongoDB集群的启动和关闭顺序
    分片(Shard)环境中的启动和关闭1.启动这个具体的参照分片的配置,启动的顺序是configserver->副本集/分片(shardX)->->mongos2.关闭因为mongos是分片架构最前端的入口,所以关闭顺序:mongos->副本集/分片(shardX)->configserver单实例:直接关闭db.getSiblingDB(“admin”).shutdow......
  • 假如你从0到1开始学习网络安全,按照这个顺序就对了!
    从零开始学习网络安全是一个系统化的过程,它涉及到多个层面的技术和理论知识。网络安全的学习顺序可以按照由浅入深、逐步递进的原则进行,以下是一个建议的网络安全学习路径:1.基础知识阶段:-计算机网络基础:理解网络架构、TCP/IP协议栈、OSI七层模型、数据链路层到应用层的......
  • 1.入门与顺序结构
    第一题:学习了输出语句,请参照例题,编写一个程序,输出以下信息:**************************HelloWorld!**************************注意:Hello与World之间有一个空格以及大小写问题*也是输出的一部分,别光打印HelloWorld!输入格式:无需输入输出格式:*************************......