C模拟实现静态顺序表

2023-05-16

头文件模块:


#include<iostream>

typedef int DATATYPE;
const  int MAX = 5;

struct SeqList
{
	DATATYPE data[MAX];		
	size_t size;			//当前的元素个数
};

void InitSeqList(SeqList* list);		//初始化列表
void PrintSeqList(SeqList* list);		//打印列表
bool Empty(SeqList* list);				//判空
void PushBack(SeqList* list, DATATYPE data);	//头插
void PopBack(SeqList* list);	//头删
void PushFront(SeqList* list, DATATYPE data);	//尾插
void PopFront(SeqList* list);	//尾删
void Insert(SeqList* list, int pos, DATATYPE data);		//随机位置的插入
void Erase(SeqList* list, int pos);						//删除指定位置的元素
void Remove(SeqList* list, DATATYPE data);				//删除值为data的元素
void RemoveAll(SeqList* list, DATATYPE data);			//删除所有值为data的元素
int Find(SeqList* list, DATATYPE data);					//查找值为data的元素
void SortList(SeqList* list);							//排序
int BinarySearch(SeqList* list, DATATYPE data);		//二分查找

函数实现模块:


#include"SeqList.h"
#include<assert.h>
#include<stdio.h>


void InitSeqList(SeqList* list)		//初始化列表
{
	list->size = 0;
	memset(list->data, 0, MAX*sizeof(DATATYPE));
}

void PrintSeqList(SeqList* list)		//打印列表
{
	assert(list);
	for (size_t i = 0; i < list->size; ++i)
	{
		printf("%d ", list->data[i]);
	}
	printf("\n");
}

void PushBack(SeqList* list, DATATYPE data)		//尾插
{
	if (list->size == MAX)
	{
		printf("表已满");
		return;
	}

	list->data[list->size] = data;
	list->size++;
}

void PopBack(SeqList* list)			//尾删
{
	if (list->size > 0)
	{
		--list->size;
	}
}

bool Empty(SeqList* list)
{
	return list->size == 0;
}

void PushFront(SeqList* list, DATATYPE data)		//头插
{
	if (list->size == MAX)
	{
		printf("表已满");
		return;
	}
	else
	{
		for (size_t i = 0; i < list->size;++i)	//将元素依次向后移,腾出第一个位置
		{
			list->data[list->size + i] = list->data[list->size + i - 1];
		}
		list->data[0] = data;
		++list->size;
	}
}

void PopFront(SeqList* list)	//头删
{
	if (Empty(list))
	{
		return;
	}
	else
	{
		if (list->size == 1)
		{
			--list->size;
		}
		else
		{
			for (size_t i = 1; i < list->size; ++i)		//将元素依次向前搬移
			{
				list->data[list->size + i - 1] = list->data[list->size + i];
			}
			--list->size;
		}
	}
}

void Insert(SeqList* list, int pos, DATATYPE data)		//随机位置的前面插入
{
	if (list->size == MAX)
	{
		return;
	}
	assert(pos < list->size);
	for (size_t i = pos; i < list->size; ++i)
	{
		list->data[list->size + i] = list->data[list->size + i - 1];
	}
	list->data[pos] = data;
	list->size++;
}

void Erase(SeqList* list, int pos)						//删除指定位置的元素
{
	if (Empty(list))
	{
		return;
	}
	else
	{
		for (size_t i = list->size; i > pos; --i)
		{
			list->data[list->size + i - 1] = list->data[list->size + i];
		}
		--list->size;
	}
}

void Remove(SeqList* list, DATATYPE data)				//删除值为data的元素
{
	if (Empty(list))
	{
		return;
	}
	else
	{
		for (size_t i = 0; i < list->size; ++i)
		{
			if (list->data[i] == data)
			{
				list->data[list->size + i - 1] = list->data[list->size + i];
			}
		}
		--list->size;
	}
}
void RemoveAll(SeqList* list, DATATYPE data)			//删除所有值为data的元素
{
	if (Empty(list))
	{
		return;
	}
	else
	{
		int count = 0;
		for (size_t i = 0; i < list->size; ++i)
		{
			if (list->data[i] == data)
			{
				++count;
				list->data[list->size + i - 1] = list->data[list->size + i];
			}
		}
		list->size = list->size - count;
	}
}
int Find(SeqList* list, DATATYPE data)					//查找值为data的元素
{
	for (size_t i = 0; i < list->size; ++i)
	{
		if (list->data[i] == data)
		{
			return list->data[i];
		}
	}
	printf("没有找到");
	return -1;
}

void SortList(SeqList* list)							//排序
{
	if (Empty(list))
	{
		return;
	}
	else
	{
		int i = 0, j = 0;
		for (i = 0; i < list->size; ++i)
		{
			for (j = 0; j < list->size - i; ++j)
			{
				if (list->data[j] < list->data[j + 1])
				{
					int temp = list->data[j];
					list->data[j] = list->data[j + 1];
					list->data[j + 1] = temp;
				}
			}
		}
	}
}

int BinarySearch(SeqList* list, DATATYPE data)		//二分查找
{
	if (Empty(list))
	{
		return -1;
	}
	else
	{
		int left = 0;
		int right = list->size - 1;
		int mid = left + ((right - left) >> 1);
		SortList(list);
		while (left<right)
		{
			if (data < list->data[mid])
			{
				right = mid - 1;
			}
			else if (data>list->data[mid])
			{
				left = mid + 1;
			}
			else
			{
				return list->data[mid];
			}
			left--;
			right++;
		}
		printf("查找的值不存在");
		return -1;
	}
}

功能测试模块:


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

#include"Seqlist.h"

void menu()
{

	printf("0.exit*************1.print_SeqList*****\n");
	printf("2.pushback*********3.pophback**********\n");
	printf("4.pushfront********5.popfront**********\n");
	printf("6.insert***********7.erase*************\n");
	printf("8.find*************9.remmove***********\n");
	printf("10.remmove_all*****11.empty************\n");
}

int main()
{
	int input = 0;
	DATATYPE data = 0;
	SeqList seqlist;
	InitSeqList(&seqlist);
	while (true)
	{
		menu();
		printf("请输入你要的选项");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			PrintSeqList(&seqlist);
			break;
		case 2:
			{
				  printf("请输入你要插入的元素");
					  scanf("%d", &data);
					  PushBack(&seqlist, data);
			}
			break;
		case 3:
			PopBack(&seqlist);
			break;
		case 4:
			{
				  printf("请输入你要插入的元素");
				  scanf("%d", &data);
				  PushFront(&seqlist, data);
			}
			break;
		case 5:
			PopFront(&seqlist);
			break;
		case 6:
			{
				  int pos = 0;
				  printf("请输入你要插入的位置");
				  scanf("%d", &pos);
				  printf("\n请输入你要插入的元素");
				  scanf("%d", &data);
				  Insert(&seqlist, pos, data);
			}
			break;
		case 7:
			{
				  int pos = 0;
				  printf("请输入你要删除的位置");
				  scanf("%d", &pos);
				  Erase(&seqlist, pos);
			}
			break;
		case 8:
			{
				  printf("请输入你要查找的元素:");
				  scanf("%d", &data);
				  Find(&seqlist, data);
			}
			break;
		case 9:
			{
				  printf("请输入你要删除的元素:");
				  scanf("%d", &data);
				  Remove(&seqlist, data);
			}
			break;
		case 10:
			{
				   printf("请输入你要删除的元素:");
				   scanf("%d", &data);
				   RemoveAll(&seqlist, data);
			}
			break;
		case 11:
			{
				   bool ret;
				   ret = Empty(&seqlist);
			}
			break;
		case 0:
			exit(0);
			break;
		default:
			break;
		}
	}
	scanf("%d", &input);
	system("pause");
	return 0;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C模拟实现静态顺序表 的相关文章

  • 逻辑思维小测试

    5位运动员参加了10米台跳水比赛 xff0c 有人让他们预测比赛结果 A选手说 xff1a B第一 xff0c 我第三 B选手说 xff1a 我第二 xff0c E第四 C选手说 xff1a 我第一 xff0c D第二 D选手说 xff1a
  • 简单逆序输出和空格转换

    1 有一个字符数组的内容为 34 student a am i 34 请你将数组的内容改为 34 i am a student 34 要求 xff1a 不能使用库函数 只能开辟有限个空间 xff08 空间个数和字符串的长度无关 xff09
  • 详解交换两个数的值

    交换两个数值 xff1a 简单来说就是将内存a中的值变成内存b中的值 xff0c 将内存b中的值变成内存a中的值 xff0c 而要想达到这种效果需要的就是交换他们彼此的地址 xff08 传地址 xff09 xff0c 如下图所示 xff08
  • 预编译小常识

    熟悉预处理标识符 xff1a LINE FILE DATE TIME include lt stdio h gt int main int i 61 0 for i 61 0 i lt 10 i 43 43 printf 34 file s
  • 数组知识总结

    一维数组 xff1a 先看两个最简单的语句 int a xff1b int b 10 显然a是一个整形变量 xff08 标量 xff09 xff0c b 10 称为数组 xff0c 表示一些整形值得集合 b表示一个指向整形的指针常量 xff
  • string函数的各种实现方式

    lt span style 61 34 font size 24px 34 gt strcpy lt span gt lt span style 61 34 font size 18px 34 gt lt span gt lt span s
  • 整数的各位数之和与指数的递归求法

    写一个递归函数DigitSum n xff0c 输入一个非负整数 xff0c 返回组成它的数字之和 include lt stdio h gt int DigitSum unsigned int n unsigned int sum 61
  • 两种计算器的实现方式

    简单的switch case实现计算器功能 xff1a include lt stdio h gt include lt stdlib h gt menu 显示计算机菜单 printf 34 1 Add n 34 printf 34 2 S
  • 简单电话本实现

    头文件模块 xff1a define CRT SECURE NO WARNINGS 1 实现一个通讯录 xff1b 通讯录可以用来存储1000个人的信息 xff0c 每个人的信息包括 xff1a 姓名 性别 年龄 电话 住址 ifndef
  • linux 画图不执行 Can't connect to X11 window server

    java在图形处理时调用了本地的图形处理库 在利用Java作图形处理 xff08 比如 xff1a 图片缩放 xff0c 图片签名 xff0c 生成报表 xff09 时 xff0c 如果运行在windows上不会出问题 如果将程序移植到Li
  • 电话本再实现

    头文件模块 xff1a define CRT SECURE NO WARNINGS 1 实现一个通讯录 xff1b 通讯录可以用来存储1000个人的信息 xff0c 每个人的信息包括 xff1a 姓名 性别 年龄 电话 住址 ifndef
  • 又一波str函数的模拟实现

    实现strchr 查找一个字符c在另一个字符串str中第一次出现的位置找到返回该位置的指针 xff0c 找不到返回NULL include lt stdio h gt char my strchr const char str int c
  • 其实你也懂指针计算

    在C语言中 xff0c 指针运算是一个让很多人感到无助的东西 xff0c 尤其在结合上数组的下标运算和指针的多级访问 xff0c 更加让指针这个东西更加神秘 xff0c 今天我们就来仔细的看一下指针之间的指向关系 下面来看一下这道题 xff
  • 注释转换

    编写一个小项目将一个一个文件中的注释都转换成C 43 43 的注释风格 设计部分 xff1a xff08 1 xff09 头文件模块 xff1a 包括模块中需要引用的头文件定义 xff0c 需要实现的主要函数的声明 xff08 2 xff0
  • atoi函数实现的各种考虑因素

    define CRT SECURE NO WARNINGS 1 include lt stdio h gt atoi实现 xff1a 将一个字符串转换为对应的整数 enum Status 定义两个枚举常量判断所给变量是否合法 kValid
  • 继承小结

    1 概念 面向对象程序设计使代码可以实现复用的最重要手段 xff0c 允许程序员在原有类特性的基础上进行扩展 xff0c 增加新的功能 2 定义格式 xff1a 首先是一个冒号 xff0c 后面紧跟以逗号分隔的基类列表 xff0c 其中每个
  • 到底多态有多难

    1 概念 多态 简单来说就是一种事物具有多种形式或者形态的特征 xff0c 好比我们生活中最简单的事物 xff0c 就像每天都会用到的水 xff0c 水有三态 xff0c 即固态 液态和气态 生活中这种多多态的例子很多 xff0c 同样在我
  • 解析模板(上)--模板函数

    模板引出 xff1a 在学习关于类的特性中 xff0c 有一个重要的特性叫做多态 xff0c 同样关于模板的学习也可以简单的把它理解成一种多态 xff0c 只不过模板中所涉及的多态是关于类型的替换 xff0c 正如在生活中使用模具一样 xf
  • 模板&仿函数的应用--冒泡排序

    普通版冒泡排序 对于冒泡排序的算法大家并不陌生 xff0c 将相临两个数一次比较 xff0c 然后将最大值或者最小值先排出来 xff0c 一般来说这样的话我们需要在碗面写两个函数来分别实现这两个算法 xff0c 程序代码如下 xff1a s

随机推荐

  • String类模拟

    span style font size 24px class String friend ostream amp operator lt lt ostream amp os String amp s 输出运算符重载 friend istr
  • win10主机ping不通win10虚拟机

    原因是ICMP回显请求规则未开启 xff0c 解决方法在文章末尾 环境说明 win10虚拟机 192 168 136 136 win10虚拟机采用的网络连接是 NAT 模式 ipconfig结果如下 xff1a 以太网适配器 Etherne
  • <操作系统> 理发店问题(选做)C语言实现

    问题描述 xff1a 代码 xff1a span class token macro property span class token directive keyword include span span class token str
  • 特殊矩阵的压缩存储及转置

    一 对称矩阵及其压缩存储 1 对称矩阵 在矩阵中最特殊的一类应该属于对称矩阵 xff0c 对称矩阵的行和列是对应相等的 对称矩阵就是关于主对角线对称 xff0c 两边的元素的值对应相等 xff0c 在数学中我们把用主对角线隔开 xff0c
  • STL浅析set&map

    map和set的底层实现原理和接口使用 1 set和map的底层实现 set和map属于STL中的一种关联式容器 xff0c 底层实现是红黑树 2 set容器的特点 1 set和map 容器中的元素自动进行有序排列 默认为升序排列 xff1
  • Linux下的文件操作权限

    Linux下进入一个目录需要什么权限 xff1f 普通用户下 xff1a 首先我们在普通用户下 xff0c 取消文件code的所有权限chmod 000 code 当我们执行cd code 想进入当前目录时 xff0c 发现权限不允许 接下
  • linux下的常见命令

    cd change directory 进入个人的主目录 cd home 进入 39 home 39 目录 39 cd 返回上一级目录 cd 返回上两级目录 cd 返回上次所在的目录 ls list 查看目录中的文件 ls l 显示文件和目
  • task_struct结构体成员小结

    背景知识 task stuct结构体 被称为进程描述符 xff0c 用 来管理进程Linux内核的进程 xff0c 这个结构体包含了一个进程所需的所有信息 它定义在 include linux sched h文件中 可以说它是linux内核
  • Linux下的简单进度条实现

    进度条 计算机在处理任务时 xff0c 实时的 xff0c 以图片形式显示处理任务的速度 xff0c 完成度 xff0c 剩余未完成任务量的大小 xff0c 和可能需要处理时间 xff0c 一般以长方形条状显示 主要功能 xff1a 1 显
  • 九大排序之——希尔排序

    希尔排序 xff1a 思想 xff1a 希尔排序是为了防止直接插入排序出现最坏情况所做的一种改进 xff0c 将原本的排序过程分为预排序和直接插入排序两个阶段 预排序阶段 xff1a 将整个预排序的序列分为若干个待排序的子序列 xff0c
  • 僵尸进程与孤儿进程模拟实现

    背景知识 僵尸进程 xff08 Zombies xff09 xff1a 1 僵尸进程是一个比较特殊的状态 xff0c 当进程退出父进程 xff08 使用wait 系统调用 xff09 没有没有读取到子进程退出的返回代码时就会产生僵尸进程 僵
  • 队列模拟实现

    队列的特点 xff1a 先进先出 后进后出 队列的常见操作 xff1a Push 往队尾插入一个元素 Pop 从队头删除一个元素 Front 返回队列的第一个元素 Back 返回队列的最后一个元素 Size 求队列的元素个数 Empty 判
  • ssh端口转发(之kettle ssh方式连接数据库)

    ssh参数解释 格式 ssh user 64 host command 选项 xff1a 1 xff1a 强制使用ssh协议版本1 xff1b 2 xff1a 强制使用ssh协议版本2 xff1b 4 xff1a 强制使用IPv4地址 xf
  • str库函数模拟实现

    常见str函数功能表 xff1a strcat 将字符串str2连接到str1之后 xff0c 并返回指针str1 strncat 将字符串from 中至多count个字符连接到字符串to中 xff0c 追加空值结束符 返回处理完成的字符串
  • min栈实现

    题目 xff1a 实现一个栈 xff0c 要求实现Push xff08 出栈 xff09 Pop xff08 入栈 xff09 Min xff08 返回最小值的操作 xff09 的时间复杂度为O 1 分析 xff1a 这道题目的主要难点在于
  • 栈实现队列&&队列实现栈

    背景知识 xff1a 动态栈的模拟实现 xff1a http blog csdn net double happiness article details 70170984 队列的模拟实现 xff1a http blog csdn net
  • 一个数组实现两个栈

    分析 xff1a 用一个数组实现两个栈有三种思路 xff1a xff08 1 xff09 将数组按照奇 偶为分成两组 xff08 2 xff09 将数组按照从两边到中间分成两组 xff08 3 xff09 将数组按照从中间到两边分成两组 比
  • 栈的压入弹出序列

    题目描述 xff1a 判断一个栈的输出序列是否是正确的 xff0c 时间复杂度要求O N 示例 xff1a 输入栈 xff1a 1 2 3 4 5 1 输出栈 xff1a 4 5 3 2 1 2 输出栈 xff1a 4 3 5 1 2 分析
  • list模拟实现

    双向链表代码实现 xff1a span style font size 24px pragma once 双向链表 template lt class T gt struct ListNode T data 当前节点中的数据 ListNod
  • C模拟实现静态顺序表

    头文件模块 xff1a span style font size 24px include lt iostream gt typedef int DATATYPE const int MAX 61 5 struct SeqList DATA