【顺序表】 c语言的顺序表

顺序表:一段地址连续的存储单元依次存储数据元素的线性结构。

静态存储的结构:

#define MAX_SIZE 5
typedef int DataType;
typedef struct SeqList
{
	DataType array[MAX_SIZE];
	size_t size;
}SeqList;

/////////////   顺序表的 增 删 查   //////////////////

void InitSeqList(SeqList* pSeq)  //初始化  
{
	assert(pSeq);
	memset(pSeq->array, 0, sizeof(DataType)*MAX_SIZE);
	pSeq->size = 0;
}
void PrintSeqList(SeqList* pSeq)
{
	int i = 0;
	assert(pSeq);
	for (i = 0; i <(int)pSeq->size; ++i)
	{
		printf("%d->", pSeq->array[i]);
	}
	printf("\n");
}

void PushBack(SeqList* pSeq, DataType x)  //尾插
{
	assert(pSeq);
	if (pSeq->size >= MAX_SIZE)
	{
		printf("SeqList is full\n");
		return;
	}
	pSeq->array[pSeq->size++] = x;

}
void PopBack(SeqList* pSeq)    //尾删
{
	assert(pSeq);
	if (pSeq->size <= 0)
	{
		printf("Seqlist is empty\n");
	}
	pSeq->array[--pSeq->size] = 0;
}
void PushFront(SeqList* pSeq, DataType x)   //头插
{
	int i = 0;
	assert(pSeq);

	if (pSeq->size >= MAX_SIZE)
	{
		printf("SeqList is full\n");
		return;
	}

	for (i = pSeq->size - 1; i >= 0; i--)
	{
		pSeq->array[i + 1] = pSeq->array[i];
	}
	pSeq->array[0] = x;
	++pSeq->size;
}
void PopFront(SeqList* pSeq)     //头删
{
	int i = 0;
	assert(pSeq);

	if (pSeq->size <= 0)
	{
		printf("SeqList is empty\n");
		return;
	}

	for (i = 1; i <(int)pSeq->size; i++)
	{
		pSeq->array[i - 1] = pSeq->array[i];
	}

	--pSeq->size;
}
void Insert(SeqList* pSeq, size_t pos, DataType x)  //增
{
	int i = 0;
	assert(pSeq);
	assert(pos <= pSeq->size);

	if (pSeq->size >= MAX_SIZE)
	{
		printf("SeqList is full\n");
		return;
	}
	for (i = pSeq->size; i > (int)pos; i--)
	{
		pSeq->array[i] = pSeq->array[i - 1];
	}

	pSeq->array[pos] = x;
	++pSeq->size;
}

int Find(SeqList* pSeq, size_t pos, DataType x) //查(从顺序表pSeq的第pos个位置开始查x)
{
	int i = pos;
	assert(pSeq);

	for (; i <(int)pSeq->size; ++i)
	{
		if (pSeq->array[i] == x)
		{
			return i;
		}
	}
	return -1;
}

void Erase(SeqList* pSeq, size_t pos) //删
{
	int i = 0;
	assert(pSeq);
	assert(pos < pSeq->size);

	if (pSeq->size <= 0)
	{
		printf("SeqList is empty\n");
		return;
	}
	for (i = pos + 1; i <(int)pSeq->size; i++)
	{
		pSeq->array[i - 1] = pSeq->array[i];
	}
	--pSeq->size;
}

int Remove(SeqList* pSeq, DataType x)
{
	int pos;
	assert(pSeq);

	pos = Find(pSeq, 0, x);
	if (pos != -1)
	{
		Erase(pSeq, pos);
	}

	return pos;
}

void RemoveAll(SeqList* pSeq, DataType x)    //清空
{
	int count = 0;
	int i = 0;
	assert(pSeq);

	for (i = 0; i <(int)pSeq->size; i++)
	{
		if (pSeq->array[i] == x)
		{
			count++;
		}
		else
		{
			pSeq->array[i - count] = pSeq->array[i];
		}
	}
	pSeq->size -= count;
}

/////////////////  顺序表的几种排序 //////////////////////

void Swap(DataType* left, DataType* right) //交换
{
	DataType tmp = *left;
	*left = *right;
	*right = tmp;
}
//冒泡排序
void BubbleSort(SeqList* pSeq)  
{
	int i = 0, j = 0;
	assert(pSeq);

	for (j = 0; j <(int)pSeq->size - 1; ++j)
	{
		int exchange = 0;

		for (i = 1; i < (int)pSeq->size - j; ++i)
		{
			if (pSeq->array[i - 1] > pSeq->array[i])
			{
				Swap(&pSeq->array[i - 1], &pSeq->array[i]);
				exchange = 1;
			}
		}

		if (exchange == 0)
		{
			return;
		}
	}
}
// 选择排序
void SeclectSort(SeqList* pSeq)
{
	int i, j;
	int min;
	assert(pSeq);

	for (j = 0; j <(int)pSeq->size - 1; ++j)
	{
		min = j;
		for (i = j + 1; i <(int)pSeq->size; ++i)
		{
			if ((int)pSeq->array[min] >(int) pSeq->array[i])
			{
				min = i;
			}
		}
		Swap(&pSeq->array[min], &pSeq->array[j]);
	}
}
//选择排序的优化
void SeclectSort_OP(SeqList* pSeq)
{
	int left = 0, right = pSeq->size - 1;
	int min = 0, max = 0, i = 0;
	assert(pSeq);

	while (left < right)
	{
		for (i = left; i <= right; ++i)
		{
			if (pSeq->array[i] < pSeq->array[left])
			{
				Swap(&pSeq->array[i], &pSeq->array[left]);
			}

			if (pSeq->array[i] > pSeq->array[right])
			{
				Swap(&pSeq->array[i], &pSeq->array[right]);
			}
		}

		++left;
		--right;
	}
}
//二分查找  数组应按顺序排列
int BinarySearch(SeqList* pSeq, DataType x)
{
	int left = 0;
	int right = pSeq->size - 1;
	assert(pSeq);

	while (left <= right)
	{
		int mid = right - (right - left) / 2;
		if (x > pSeq->array[mid])
		{
			left = mid + 1;
		}
		else if (x < pSeq->array[mid])
		{
			right = mid - 1;
		}
		else
		{
			return mid;
		}
	}

	return -1;
}

欢迎大家补充顺序表的更多知识。

时间: 2024-10-14 03:39:50

【顺序表】 c语言的顺序表的相关文章

线性表之顺序表(C语言实现)

线性表是从数据元素的逻辑结构上定义的. 这种数据元素的逻辑结构的特征如下: 1.除开第一个和最后一个元素之外.所有元素都有一个前驱元素和后继元素. 2.第一个元素无前驱元素,但有后继元素. 3.最后一个元素有前驱元素,单无后继元素. 可以抽象为如下表述: 元素1 元素2 元素3 元素4 元素5 元素6 然而同一种逻辑结构在内存中却可以有两种存储方式:1.在内存中连续存储的线性表-----顺序表(如数组)                  2.在内存中离散存储的线性表-----链表(如单链表,双链

用C语言实现顺序表的插入和删除算法

什么是线性表? 线性表是n个数据元素的有限序列.根据线性表的显现方式,线性表又分为顺序表(数据元素在内存中的存储空间是连续的)和链表(数据元素在内存中的存储空间是不连续的). 线性表如何用C语言实现?线性表可以进行哪些操作? 在C语言中,线性表通过结构体的方式来实现.结构体中定义了线性表的存储空间地址,当前长度,和当前分配的存储容量.操作包含在指定位置插入某一元素.删除指定元素.查找指定的元素等.在这里重点介绍插入和删除算法. 下面就是关于这一部分内容的陈述. 线性表的C语言实现 需要先定义好的

Java语言描述顺序表类,顺序表类的基本操作实现

数据结构(Java版)ch2 线性表的顺序存储(顺序表) 线性表的抽象数据Java接口描述如下: package ch2; /** * 线性表的抽象数据接口,用Java语言描述线性表的这些功能! * @author 房廷飞 * */ public interface IList { public void clear(); //将线型表置成空表 public boolean isEmpty(); //判断是不是空表 public int length(); //返回线性表的长度 public O

c语言实现顺序表的基本操作

转自 https://www.cnblogs.com/rookiefly/p/3425075.html 原作者:Step by Step 经过三天的时间终于把顺序表的操作实现搞定了.(主要是在测试部分停留了太长时间) 1;线性表顺序存储的概念:指的是在内存中用一段地址连续的存储单元依次存储线性表中的元素. 2;采用的实现方式:一段地址连续的存储单元可以用固定数组或者动态存储结构来实现,这里采用动态分配存储结构. 3;顺序表的定义及操作集合:头文件为defs.h 1 #ifndef _DEFS_H

算法学习之查找算法:静态查找表(1)顺序表查找

引言: 对查找表一般的操作有:1.查询某个"特定的"数据元素是否在查找表中:2.检索某个"特定的"数据元素的各种属性:3.在查找表中插入一个数据元素:4.从查找表中删去某个数据元素. 静态查找表的操作只包括两种:1.查找某个"特定的"数据元素是否在查找表中:2.检索某个"特定的"数据元素的各种属性: 静态查找表又有四种表现形式:顺序表的查找.有序表的查找.静态树的查找.索引顺序表的查找. 静态查找涉及的关键字类型和数据元素类型

SQL Server中多表连接时驱动顺序对性能的影响

原文:SQL Server中多表连接时驱动顺序对性能的影响 本文出处:http://www.cnblogs.com/wy123/p/7106861.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他) 最近在SQL Server中多次遇到开发人员提交过来的有性能问题的SQL,其表面的原因是表之间去的驱动顺序造成的性能问题,具体表现在(已排除其他因素影响的情况下),存储过程偶发性的执行时间超出预期,甚至在调试的时候

线性表 及Java实现 顺序表、链表、栈、队列

数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值,至少在一段时间之后,技术可以很快得到提高.同时,它也是软考的重点,我们需要对这部分的内容进行一下总结. 我们先看一下数据结构和算法的整体内容. 1.线性表 概念: 数据元素的排列方式是线性的. 分类: 分类规则是根据上图中元素的存储结构来划分的. (1)顺序表 基本思想:元素的存储空间是连续的.在内

《线性表的总结---线性顺序表(静态,动态)---线性链表(动态)》

[静态顺序表的练习] /* 需求:创建一个静态的顺序表存放整数,大小为10,完成以下操作 1,输入6个整数,打印出顺序表中的内容,并显示表中剩余的空间个数. 2,在顺序表中的第3个位置插入元素0,打印输出顺序表中的内容,并显示表中剩余的空间个数. 3,再试图插入表中第11个位置整数0,程序提示超出范围. 4,删除表中第6个元素,打印出顺序表中的内容,并显示表中剩余的空间个数. */ /* #include<stdio.h> #define MaxSize 10 //想顺序表中插入元素 void

2-01基本顺序表与元素外置顺序表recv

顺序表 在程序中,经常需要将一组(通常是同为某个类型的)数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传进传出函数等,一组数据中包含的元素个数可能发生变化(可以增加或删除元素). 对于这种需求,最简单的解决方案遍是将这样一组元素看成是一个序列,用元素在序列里的位置和顺序,表示实际应用中的某种有意义的信息,或者表示数据之间的某种关系. 这样的一组序列元素的组织形式,我们可以将其抽象为线性表.一个线性表是某类元素的一个集合,还记录着元素之间的一种顺序关系,线性表是最基本的数据结构之

使用C语言实现线性表

线性表是最常用且最简单的一种数据结构.一个线性表是n个数据元素的有限序列,序列中的每个数据元素,可以是一个数字,可以是一个字符,也可以是复杂的结构体或对象.例如:1,2,3,4,5是一个线性表,A,B,C,D...Z是一个线性表,一列列车的车厢1,车厢2...车厢n是一个线性表. 线性表的机内表示法(又称存储结构)有2种,一种是顺序存储结构,另一种是链式存储结构. 顺序存储结构,顾名思义就是按顺序来存储的一种存储结构,比如线性表(1,2,3,4,5),共计5个元素,每个int型的数据元素假设占用