再写顺序表(c语言实现,外加冒泡排序,二分查找)
概念
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组 上完成数据的增删查改。
- 顺序表一般可以分为:
- 静态顺序表:使用定长数组存储。
- 动态顺序表:使用动态开辟的数组存储。
头文件声明
SeqList.h
#pragma once
#include<stdbool.h>typedef int SDataType;
/*
//静态顺序表
typedef struct SeqList{SDataType array[100]; //能存100个数的静态顺序表int size; //表是当前顺序表中有多少个数,顺便也表示了即将插入的下标} SeqList;
*///动态顺序表
typedef struct SeqList{SDataType *array; //指上堆上的空间int size; //表是当前顺序表中有多少个数,顺便也表示了即将插入的下标int capacity; //容量
} SeqList;//初始化/销毁
//seqlist 是一个变量的地址
//capacity 表示顺序表的容量
void SeqListInit(SeqList * seqlist,int capacity);
void SeqListDestroy(SeqList * seqlist);//增删改查//插入 (前,中,后)
//尾插
void SeqListPushBack(SeqList *seqlist, SDataType value);
//头插
void SeqListPushFront(SeqList * seqlist, SDataType value);
//中间插入
void SeqListInsert(SeqList *seqlsit, int pos, SDataType value);//删除
//尾删
void SeqListPopBack(SeqList *seqlist);
//头删
void SeqListPopFront(SeqList *seqlist);
//删除pos所在的下标的数据
void SeqListErase(SeqList *seqlist, int pos);//打印
void SeqListPrint(const SeqList *seqlist);
//修改pos所在下标的数据为value
void SeqListModify(SeqList *seqlist, int pos, SDataType value);
//查找
int SeqListFind(const SeqList *seqlist, SDataType value);
//找到并删除遇到的第一个value
void SeqListRemove(SeqList *seqlist, SDataType value);
//判断顺序表是否为空
bool SeqListEmpty(const SeqList *seqlist);
//返回数据个数
int SeqListSize(const SeqList *seqlist);//冒泡排序
void SeqListBubbleSort(SeqList *seqlist);
//二分查找
int SeqListSort(const SeqList *seqlist, SDataType value);
//删除遇到的所有value
void SeqListRemoveAll(SeqList *seqlist, SDataType value);
顺序表主要功能实现
SeqList.c
#include"SeqList.h"
#include<assert.h>
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>//检查是否需要扩容,如果需要扩容就进行扩容
//保证函数结束后,容量一定够用
static void CheckCapacity(SeqList *seqlist)
{assert(seqlist != NULL);assert(seqlist->array != NULL);assert(seqlist->size <= seqlist->capacity);if (seqlist->size < seqlist->capacity){return;}//空间扩大两倍int capacity = 2 * seqlist->capacity;//申请新空间SDataType *array = (SDataType *)malloc(sizeof(SDataType)*capacity);assert(array);//搬移for (int i = 0; i < seqlist->size; i++){array[i] = seqlist->array[i];}//释放原空间free(seqlist->array);seqlist->array = array;
}void SeqListInit(SeqList * seqlist, int capacity)
{assert(seqlist != NULL);seqlist->array = (SDataType*)malloc(sizeof(SDataType)* capacity);assert(seqlist->array);seqlist->size = 0;seqlist->capacity = capacity;
}void SeqListDestroy(SeqList * seqlist)
{assert(seqlist != NULL);assert(seqlist->array != NULL);free(seqlist->array);seqlist->array = NULL;seqlist->size = 0;seqlist->capacity = 0;
}
//尾插
void SeqListPushBack(SeqList *seqlist, SDataType value)
{assert(seqlist != NULL);assert(seqlist->array !=NULL);CheckCapacity(seqlist);seqlist->array[seqlist->size] = value;seqlist->size++;
}
//尾删
void SeqListPopBack(SeqList *seqlist)
{assert(seqlist != NULL);assert(seqlist->array != NULL);assert(seqlist->size > 0); //数据元素个数大于0seqlist->size--;
}
//头插
/*1. 从后往前搬,避免覆盖2. 写循环先确定循环的边界i 空间下表 [size,0)i 数据下标 [size -1,0]3. 搬移空间下标:array[i] = array[i-1];数据下标:array[i+1] = array[i];
*/
void SeqListPushFront(SeqList * seqlist, SDataType value)
{assert(seqlist != NULL);assert(seqlist->array != NULL);CheckCapacity(seqlist);//做数据的搬移,i代表空间下标for (int i = seqlist->size; i > 0; i--){seqlist->array[i] = seqlist->array[i - 1];}seqlist->array[0] = value;seqlist->size++;
}
//前删
void SeqListPopFront(SeqList *seqlist){assert(seqlist != NULL);assert(seqlist->array != NULL);assert(seqlist->size > 0);#if 0for (int i = 0; i < seqlist->size; i++){seqlist->array[i] = seqlist->array[i + 1];}
#endiffor (int i = 1; i < seqlist->size; i++){seqlist->array[i - 1] = seqlist->array[i];}seqlist->size--;
}//中间插
void SeqListInsert(SeqList *seqlist, int pos, SDataType value){assert(seqlist != NULL);assert(seqlist->array != NULL);assert(pos >= 0 && pos <= seqlist->size);CheckCapacity(seqlist);for (int i = seqlist->size - 1; i >= pos; i--){seqlist->array[i + 1] = seqlist->array[i];}seqlist->array[pos] = value;
}//中间删
void SeqListErase(SeqList *seqlist, int pos){assert(seqlist!= NULL);assert(seqlist->array != NULL);assert(seqlist->size > 0);assert(pos >= 0 && pos < seqlist->size);
#if 0//i代表数据for (int i = pos; i < seqlist->size - 1; i++){seqlist->array[i] = seqlist->array[i + 1];}
#endif//i代表数据for (int i = pos + 1; i < seqlist->size ; i++){seqlist->array[i - 1] = seqlist->array[i];}seqlist->size--;
}//打印
void SeqListPrint(const SeqList *seqlist){for (int i = 0; i < seqlist->size; i++)printf("%d", seqlist->array[i]);printf("\n");
}
//修改pos所在下标的数据为value
void SeqListModify(SeqList *seqlist, int pos, SDataType value){assert(pos >= 0 && pos < seqlist->size);seqlist->array[pos] = value;
}
//查找
//找到返回下标
//没找到返回-1
int SeqListFind(const SeqList *seqlist, SDataType value){for (int i = 0; i < seqlist->size; i++){if (seqlist->array[i] == value){return i;}}return -1;
}
//找到并删除遇到的第一个value
void SeqListRemove(SeqList *seqlist, SDataType value){int pos = SeqListFind(seqlist, value);if (pos != -1){SeqListErase(seqlist, pos);}
}
//判断顺序表是否为空
bool SeqListEmpty(const SeqList *seqlist){return seqlist->size == 0;
}
//返回数据个数
int SeqListSize(const SeqList *seqlist){return seqlist->size;
}void Swap(int *a, int *b)
{int t = *a;*a = *b;*b = t;
}//冒泡排序
void BubbleSort(int array[], int size)
{int isSorted; //如果数组本身有序,就可以优化for (int i = 0; i < size - 1; i++){isSorted = 1; //1代表有序//一次冒泡过程//一次冒泡过程中,如果没有交换就说明本身有序for (int j = 0; j < size - 1 - i; j++){if (array[j]>array[j + 1]){Swap(array + j, array + j + 1);//Swap(&array[i])isSorted = 0;}}//一次冒泡结束if (isSorted == 1){break;}}
}//冒泡排序
void SeqListBubbleSort(SeqList *seqlist){BubbleSort(seqlist->array, seqlist->size);
}//二分查找
int SeqListSort(const SeqList *seqlist, SDataType value)
{int left = 0;int right = seqlist->size;while (left < right){int mid = (right - left) / 2 + left;if (value == seqlist->array[mid]){return mid;}else if (value < seqlist->array[mid]){right = mid;}else{left = mid + 1;}}return -1;
}void SeqListRemoveAll(SeqList *seqlist, SDataType value){#if 0 //O(N*2) O(1)int pos;while ((pos = SeqListFind(seqlist, value)) != -1){SeqListErase(seqlist, pos);}
#endif#if 0 //O(N) O(N)//开辟新数组SDataType *array = (SDataType *)malloc(sizeof(SDataType)* seqlist->size);assert(array);//搬出去int index = 0;for (int i = 0; i < seqlist->size; i++){if (seqlist->array[i] != value){array[index] = seqlist->array[i];index++;}}//搬回去for (int j = 0; j < index; j++){seqlist->array[j] = array[j];}seqlist->size = index;
#endifint index = 0;for (int i = 0; i < seqlist->size; i++){if (seqlist->array[i] != value){seqlist->array[index] = seqlist->array[i];index++;}}seqlist->size = index;
}
测试用例
Main.c
#include"SeqList.h"void TestSeqList1()
{SeqList seqlist;SeqListInit(&seqlist, 100);SeqListPushBack(&seqlist, 1);SeqListPushBack(&seqlist, 2);SeqListPushBack(&seqlist, 3);//1,2,3SeqListPushFront(&seqlist, 11);SeqListPushFront(&seqlist, 12);SeqListPushFront(&seqlist, 13);//13,12,11,1,100,2,3SeqListInsert(&seqlist, 4, 100);//13,12,11,1,100,2,3SeqListPopBack(&seqlist);//13,12,11,1,100,2SeqListPopFront(&seqlist);//12,11,1,100,2SeqListErase(&seqlist, 3);//12,11,100,2SeqListDestroy(&seqlist);
}void TestSeqList2()
{SeqList seqlist;SeqListInit(&seqlist, 10);SeqListPushBack(&seqlist, 3);SeqListPushBack(&seqlist, 5);SeqListPushBack(&seqlist, 2);SeqListPushBack(&seqlist, 7);SeqListPushBack(&seqlist, 9);SeqListPushBack(&seqlist, 4);SeqListPushBack(&seqlist, 8);SeqListPushBack(&seqlist, 6);SeqListPushBack(&seqlist, 1);SeqListPushBack(&seqlist, 0);SeqListBubbleSort(&seqlist);int r = SeqListSort(&seqlist, 3);printf("%d\n", r);SeqListPrint(&seqlist);
}int main()
{TestSeqList2();system("pause");return 0;
}
再写顺序表(c语言实现,外加冒泡排序,二分查找)相关推荐
- c语言线性顺序表,C语言程序——线性顺序表.doc
C语言程序--线性顺序表.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文 ...
- 顺序表的插入与删除java_C++实现顺序表的常用操作(插入删出查找输出)
实现顺序表的插入,删除,查找,输出操作在C语言中经常用到.下面小编给大家整理实现代码,一起看下吧 代码如下所示: #include using namespace std; #define MAXSI ...
- 删除所有奇数顺序表c语言,怎么将一个线性表(顺序表)拆分成两个奇偶表(C语言)?...
如何将线性表A拆分成线性表A和B,使得A存放奇数,B存放偶数? 1.基础函数 1.1 get取函数 int get(nod *la,int i) { return la->data[i]; } ...
- 图书信息管理系统(数据结构顺序表,c语言版)
图书信息管理系统 顺序表 一.实验题目 二.工具环境 三.实验问题 问题: 四.实验代码 五.解决方法 方法: 一.实验题目 图书信息管理系统 出版社有一些图书数据,为简单起见,在此假设每种图书只包括 ...
- 数据结构-顺序表-c++语言-模板类实现代码(附详细解释) _清风明月
#include<iostream> #include<new> #define MAXSIZE 1000 #define REALLOC 10 using namespace ...
- 线性表之顺序表(C语言实现)
线性表是从数据元素的逻辑结构上定义的. 这种数据元素的逻辑结构的特征如下: 1.除开第一个和最后一个元素之外.所有元素都有一个前驱元素和后继元素. 2.第一个元素无前驱元素,但有后继元素. 3.最后一 ...
- c语言实验报告 折半查找法,C语言数组之冒泡排序+折半查找法(二分查找)
冒泡排序算法 将相邻的元素进行两两比较,大的向后"冒", 小的向前"赶". 口诀: N个数字来排队,两两比较小靠前 外层循环N-1(控制需要比较的轮数). 内层 ...
- C语言经典算法之二分查找详解
作者:敲代码の流川枫 博客主页:流川枫的博客 专栏:C语言从入门到进阶 语录:Stay hungry stay foolish 集接口文档工具.接口Mock工具.接口自动化测试工具.接口调试工具于一体 ...
- 删除所有奇数顺序表c语言,如何删除列表中的所有奇数序数项?
您的代码失败了,因为您试图修改正在迭代的列表,而不考虑副作用.你知道吗x = ['apple','fruit','orange','fruit','lemon','fruit'] for i in r ...
最新文章
- JavaScript数学,四舍五入到小数点后两位[重复]
- MYSQL注入天书之order by后的injection
- 谈谈晋升-互联网民工篇
- Transformer模型拆解分析
- 【JEECG技术文档】JEECG在线聊天插件功能集成文档
- 2021年第一篇原创——Spring核心初探~
- Python 命令行之旅:深入 argparse(二)
- 不让EditText打开就获取焦点
- IIS中间件渗透总结
- 论文模型构建的步骤_论文实证经验分享|VAR模型实操步骤(下)
- 软件需求分析是什么?
- 【洛谷试炼场】洛谷新手村——循环!循环!循环!
- go语言加解密算法 md5 sha256
- 计算机教程求和,电脑excel求和怎么操作步骤 | excel竖列自动求和sum
- flash 与3D笔记:图片墙(1)
- 列出一些既好玩又能提高英语水平的电脑游戏
- Kotlin学习笔记(八)by的作用,属性委托和类的委托,和Lazy的关系
- ubuntu 下pip的卸载,安装,更新与使用
- jQuery新手入门
- 在PlatEMO v2.9中增加多模态多目标算法(1)