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

#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语言实现的顺序表的更多相关文章

  1. 数据结构C语言版--动态顺序表的基本功能实现(二)

    /* * 若各个方法结构体变量参数为: &L(即地址符加变量)则结构体变量访问结构成员变量时使用"." * 若为:*L(即取地址符加变量)则结构体变量访问结构体成员变量使用 ...

  2. C语言学习笔记-顺序表

    #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include "coni ...

  3. C语言版本:顺序表的实现

    seqlist.h #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #include<cstdio> #include<malloc.h> ...

  4. c语言描述的顺序表实现

    //顺序表的实现:(分配一段连续地址给顺序表,像数组一样去操作) #include<stdio.h> #include<stdlib.h> #define OK 1 #defi ...

  5. C语言项目实现顺序表

    #include <stdio.h> #include <stdlib.h> #include "test_顺序表声明.h" /* run this pro ...

  6. 数据结构C语言版--静态顺序表的基本功能实现(一)

    /* * 功能:创建一个线性表,并输出 * 静态分配内存 */ #include<stdio.h> //stdio.h是C的标准I/O库 //#include<iostream> ...

  7. 【数据结构】之顺序表(Java语言描述)

    之前总结过使用C语言描述的顺序表数据结构.在C语言类库中没有为我们提供顺序表的数据结构,因此我们需要自己手写,详细的有关顺序表的数据结构描述和C语言代码请见[我的这篇文章]. 在Java语言的JDK中 ...

  8. 【数据结构】之顺序表(C语言描述)

    顺序表是线性表的一种,它将元素存储在一段连续的内存空间中,表中的任意元素都可以通过下标快速的获取到,因此,顺序表适合查询操作频繁的场景,而不适合增删操作频繁的场景. 下面是使用 C语言 编写的顺序表的 ...

  9. C语言实现顺序表

    C语言实现顺序表代码 文件SeqList.cpp #pragma warning(disable: 4715) #include"SeqList.h" void ShowSeqLi ...

随机推荐

  1. 在Apache Tomcat 7设置redis作为session store

    在Apache Tomcat 7设置redis作为session store  //输出tomcat控制台日志 root@ubuntu:~# cd /usr/tomcat/apache-tomcat- ...

  2. CentOS开发环境LAMP搭建

    CentOS开发环境搭建 -------------------------------------------------------------------------准备工作---------- ...

  3. js获取浏览器类型

    function add(){ var userAgent = navigator.userAgent, rMsie = /(msie\s|trident.*rv:)([\w.]+)/, rFiref ...

  4. 前端JS开发框架-DHTMLX

    一:介绍 dhtmlxSuite是一个JavaScript库,提供了一套完整的Ajax -驱动UI组件.我们能够使用dhtmlxSuite构建 简洁界面,快速性能,和丰富用户体验的企业级web应用程序 ...

  5. MySQL性能监控工具-MONyog

      1.登录配置界面 2.show processlist 查看当前使用的进程 3.警告建议你应该优化哪些参数. 4.介绍一下慢查询的配置,其它的可以自己配置,都是简单的英文. 该工具,用着还不错.其 ...

  6. Default route and zero route

    A default route of a computer that is participating in computer networking is the packet forwarding ...

  7. Adobe Flash Platform产品介绍

    解释 adobe flash platform flex是一个免费的开源的框架 该应用程序通常是用在 浏览器和 桌面 AIR中的 了解 flex框架 ,Flex sdk 和adobe flash bu ...

  8. HINSTANCE数据类型

    作者:马 岩(Furzoom) (http://www.cnblogs.com/furzoom/)版权声明:本文的版权归作者与博客园共同所有.转载时请在明显地方注明本文的详细链接,未经作者同意请不要删 ...

  9. Android AsyncTask 初探

    因为在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行.在单线程模型中始终要记住两条法则: 1. 不要阻塞UI线程 2. 确 ...

  10. 学习笔记_Java_day13_JSTL标签库(1、2、3、4、5、6、7、8)

    1.一种标签语言 day13 l  JSTL标签库(重点) l  自定义标签(理解) l  MVC设计模式(重点中的重点) l  Java三层框架(重点中的重点) JSTL标签库 1 什么是JSTL ...