C语言实现的顺序表
顺序表是用一段地址连续的存储单元依次存储数据元素的线性结构。顺序表可分为静态存储和动态存储,静态顺序表比较简单,数据空间固定,而动态顺序表可以动态增容,便于存放大量数据,现主要把动态的基本实现一下~此处的排序简单实现了一下,后面会整理出各种排序~~

#define MAX_SIZE 100
#define INIT_SIZE 3
typedef int DataType;
//顺序表的静态存储
typedef struct SeqList_s
{
DataType array[MAX_SIZE]; //数据段
size_t size; //数据的个数
}SeqList_s;
//顺序表的动态存储
typedef struct SeqList_d
{
DataType* array; //数据块指针
size_t size; //有效数据的个数
size_t capacity; //容量
}SeqList_d;
//检查容量,增容
void CheckCapacity(SeqList_d *pSeq)
{
assert(pSeq);
DataType* temp;
if (pSeq->size >= pSeq->capacity)
{
pSeq->capacity *= 2; //容量增至2倍
temp = (DataType*)realloc(pSeq->array, pSeq->capacity*sizeof(DataType));
if (NULL == temp)
{
return;//如果没有增容成功,返回
}
pSeq->array = temp;
}
else
{
return;
}
}
//初始化
int InitSeqList_d(SeqList_d* pSeq)
{
assert(pSeq);
pSeq->array = (DataType*)malloc(sizeof(DataType)*INIT_SIZE);
if (NULL == pSeq)
{
return 0; //未成功
}
pSeq->size = 0;
pSeq->capacity = INIT_SIZE;
return 1;
}
//查找
size_t Find(SeqList_d* pSeq, DataType x)
{
assert(pSeq);
size_t pos = pSeq->size; //用pos记录x所在位置,若大于等于size,则说明未找到
for (size_t i = 0; i < pSeq->size; i++)
{
if (*(pSeq->array + i) == x)
{
pos = i;
break;
}
}
if (pos >= pSeq->size)
{
printf("未找到\n");
}
return pos;
}
//尾插
void PushBack(SeqList_d* pSeq, DataType x)
{
assert(pSeq != NULL);
CheckCapacity(pSeq);
pSeq->array[pSeq->size++] = x;
}
//插入
void Insert(SeqList_d* pSeq, size_t pos, DataType x)
{
assert(pSeq);
CheckCapacity(pSeq);
if (pos > pSeq->size)
{
printf("插入位置有误!\n");
return;
}
DataType* temp = pSeq->array + pSeq->size - 1;
while (temp >= (pSeq->array + pos))
{
*(temp + 1) = temp;
temp--;
}
////也可以这样移动
//for (size_t i = pSeq->size - 1; i >= pos; i--)
//{
// pSeq->array[i+1] = pSeq->array[i];
//}
*(pSeq->array + pos) = x;
pSeq->size++;
}
//删除pos位置的数据
void Erase(SeqList_d* pSeq, size_t pos)
{
assert(pSeq);
if (pos < 0 || pos >= pSeq->size)
{
printf("要删除的位置有误!\n");
return;
}
for (size_t i = pos; i < pSeq->size; i++)
{
*(pSeq->array + i) = *(pSeq->array + i + 1);
}
pSeq->size--;
}
//删除找到的第一个x
void Remove(SeqList_d* pSeq, DataType x)
{
assert(pSeq);
size_t pos = Find(pSeq, x);
if (pos < 0 || pos >= pSeq->size)
{
printf("没有x这个数据!\n");
return;
}
else
{
for (size_t i = pos; i < pSeq->size; i++)
{
*(pSeq->array + i) = *(pSeq->array + i + 1);
}
pSeq->size--;
}
}
//删除所有的x(有优化)
void RemoveAll(SeqList_d* pSeq, DataType x)
{
assert(pSeq);
size_t first = 0, second = 0, count = 0;
while (second < pSeq->size)
{
if (*(pSeq->array + second) == x)
{
count++;
}
else
{
*(pSeq->array + first) = *(pSeq->array + second);
first++;
}
second++;
}
pSeq->size -= count;
}

用second指针遍历顺序表,用first指针记录删除后的顺序表。
当second指针不是指向所要删除的数据3时,second指向的数据赋给first指向的数据,first指针和second指针同时向后指;
当second指针指向所要删除的数据3时,first指针不动,count计数加1,second指针继续向后指。
这样就把数据删除了~~~这种方法比找到一个就挪动一次顺序表要高效一些。。。
//排序(从小到大)
void Sort(SeqList_d* pSeq)
{
assert(pSeq);
if (pSeq->size <= 0)
{
return;
}
DataType temp;
bool flag = true;
for (size_t i = 0; (i < pSeq->size - 1) && flag; i++) //进行size-1趟排序
{
flag = false;
for (size_t j = 0; j < pSeq->size - i - 1; j++)
{
if (*(pSeq->array + j) > *(pSeq->array + j + 1))
{
temp = *(pSeq->array + j);
*(pSeq->array + j) = *(pSeq->array + j + 1);
*(pSeq->array + j + 1) = temp;
flag = true;
}
}
}
}
//二分查找(非递归)
int BinarySearch(SeqList_d* pSeq, DataType x)
{
assert(pSeq);
int left = 0, right = pSeq->size - 1;
int mid;
while (left <= right)
{
mid = left + (right - left) / 2; //这样算mid可以避免溢出
if (*(pSeq->array + mid) < x) //x在后边部分
{
left = mid + 1;
}
else if (*(pSeq->array + mid) > x) //x在前半部分
{
right = mid - 1;
}
else
{
return mid;
break;
}
}
return -1;
}
//二分查找(递归)
int _BinarySearch_R(SeqList_d* pSeq, int left, int right, DataType x)
{
assert(pSeq);
if (left <= right)
{
int mid = left + (right - left) / 2;
if (pSeq->array[mid] < x)
{
return _BinarySearch_R(pSeq, mid + 1, right, x);
}
else if (pSeq->array[mid] > x)
{
return _BinarySearch_R(pSeq, left, mid - 1, x);
}
else
{
return mid;
}
}
return -1;
}
int Binary_R(SeqList_d* pSeq, DataType x)
{
return _BinarySearch_R(pSeq, 0, pSeq->size - 1, x);
}
C语言实现的顺序表的更多相关文章
- 数据结构C语言版--动态顺序表的基本功能实现(二)
/* * 若各个方法结构体变量参数为: &L(即地址符加变量)则结构体变量访问结构成员变量时使用"." * 若为:*L(即取地址符加变量)则结构体变量访问结构体成员变量使用 ...
- C语言学习笔记-顺序表
#include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include "coni ...
- C语言版本:顺序表的实现
seqlist.h #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #include<cstdio> #include<malloc.h> ...
- c语言描述的顺序表实现
//顺序表的实现:(分配一段连续地址给顺序表,像数组一样去操作) #include<stdio.h> #include<stdlib.h> #define OK 1 #defi ...
- C语言项目实现顺序表
#include <stdio.h> #include <stdlib.h> #include "test_顺序表声明.h" /* run this pro ...
- 数据结构C语言版--静态顺序表的基本功能实现(一)
/* * 功能:创建一个线性表,并输出 * 静态分配内存 */ #include<stdio.h> //stdio.h是C的标准I/O库 //#include<iostream> ...
- 【数据结构】之顺序表(Java语言描述)
之前总结过使用C语言描述的顺序表数据结构.在C语言类库中没有为我们提供顺序表的数据结构,因此我们需要自己手写,详细的有关顺序表的数据结构描述和C语言代码请见[我的这篇文章]. 在Java语言的JDK中 ...
- 【数据结构】之顺序表(C语言描述)
顺序表是线性表的一种,它将元素存储在一段连续的内存空间中,表中的任意元素都可以通过下标快速的获取到,因此,顺序表适合查询操作频繁的场景,而不适合增删操作频繁的场景. 下面是使用 C语言 编写的顺序表的 ...
- C语言实现顺序表
C语言实现顺序表代码 文件SeqList.cpp #pragma warning(disable: 4715) #include"SeqList.h" void ShowSeqLi ...
随机推荐
- 在Apache Tomcat 7设置redis作为session store
在Apache Tomcat 7设置redis作为session store //输出tomcat控制台日志 root@ubuntu:~# cd /usr/tomcat/apache-tomcat- ...
- CentOS开发环境LAMP搭建
CentOS开发环境搭建 -------------------------------------------------------------------------准备工作---------- ...
- js获取浏览器类型
function add(){ var userAgent = navigator.userAgent, rMsie = /(msie\s|trident.*rv:)([\w.]+)/, rFiref ...
- 前端JS开发框架-DHTMLX
一:介绍 dhtmlxSuite是一个JavaScript库,提供了一套完整的Ajax -驱动UI组件.我们能够使用dhtmlxSuite构建 简洁界面,快速性能,和丰富用户体验的企业级web应用程序 ...
- MySQL性能监控工具-MONyog
1.登录配置界面 2.show processlist 查看当前使用的进程 3.警告建议你应该优化哪些参数. 4.介绍一下慢查询的配置,其它的可以自己配置,都是简单的英文. 该工具,用着还不错.其 ...
- Default route and zero route
A default route of a computer that is participating in computer networking is the packet forwarding ...
- Adobe Flash Platform产品介绍
解释 adobe flash platform flex是一个免费的开源的框架 该应用程序通常是用在 浏览器和 桌面 AIR中的 了解 flex框架 ,Flex sdk 和adobe flash bu ...
- HINSTANCE数据类型
作者:马 岩(Furzoom) (http://www.cnblogs.com/furzoom/)版权声明:本文的版权归作者与博客园共同所有.转载时请在明显地方注明本文的详细链接,未经作者同意请不要删 ...
- Android AsyncTask 初探
因为在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行.在单线程模型中始终要记住两条法则: 1. 不要阻塞UI线程 2. 确 ...
- 学习笔记_Java_day13_JSTL标签库(1、2、3、4、5、6、7、8)
1.一种标签语言 day13 l JSTL标签库(重点) l 自定义标签(理解) l MVC设计模式(重点中的重点) l Java三层框架(重点中的重点) JSTL标签库 1 什么是JSTL ...