C语言实现顺序表的增删查改以及排序

顺序表是线性表中的一种重要的数据结构,也是最基础的数据结构,今天我用C语言实现下线性表的基本操作,以及冒泡排序与选择排序在线性表中的算法实践,代码如下:

seqlist.h:

#ifndef __SEQLIST__
#define __SEQLIST__
#define MAX 5
#include <stdlib.h>
typedef int DataType;
typedef struct SeqList
{
DataType array[MAX];
size_t size;
}SeqList;
void PrintSeqList(SeqList* pSeq);
void InitSeqList(SeqList* pSeq);
void PushBack(SeqList* pSeq,DataType x);
void PopBack(SeqList* pSeq);
void PushFront(SeqList* pSeq,DataType x);
void PopFront(SeqList* pSeq);
void Insert(SeqList* pSeq, size_t pos, DataType x);
int Find(SeqList* pSeq, DataType x);
void Erase(SeqList* pSeq, size_t pos);
void Remove(SeqList* pSeq, DataType x);
void RemoveAll(SeqList* pSeq, DataType x);
void BubbleSort(SeqList* pSeq);
void SeclectSort(SeqList* pSeq);
#endif

SeqList.c:

#include "Seqlist.h"
#include <assert.h>
#include <stdio.h>
void static Swap(DataType *left, DataType *right)//内部实现交换的函数
{
DataType tmp = *left;
*left = *right;
*right = tmp;
}
void PrintSeqList(SeqList* pSeq)//打印线并表的内容
{
assert(pSeq);
size_t i = 0;
if (pSeq->size == 0)
{
printf("顺序表为空\n");
return;
}
for (; i < pSeq->size; i++)
{
printf("%d ", pSeq->array[i]);
}
printf("\n");
return;
}
void InitSeqList(SeqList* pSeq)//初始化线性表
{
assert(pSeq);
pSeq->size = 0;
}
void PushBack(SeqList* pSeq, DataType x)//尾插
{
assert(pSeq);
if (pSeq->size == MAX)
{
printf("线性表已满\n");
return;
}
pSeq->array[pSeq->size++] = x;
return;
}
void PopBack(SeqList* pSeq)//尾删
{
assert(pSeq);
if (pSeq->size == 0)
{
printf("线性表为空,删除失败\n");
return;
}
pSeq->size--;
return;
}
void PushFront(SeqList* pSeq, DataType x)//头插
{
size_t i = pSeq->size;
assert(pSeq);
if (pSeq->size == MAX)
{
printf("线性表已满\n");
return;
}
for (; i>0; i--)
{
pSeq->array[i] = pSeq->array[i-1];
}
pSeq->array[i] = x;
pSeq->size++;
return;
}
void PopFront(SeqList* pSeq)//头删
{
size_t i = 0;
assert(pSeq);
if (pSeq->size == 0)
{
printf("线性表空\n");
return;
}
for (; i<pSeq->size-1; i++)
{
pSeq->array[i+1] = pSeq->array[i];
}
pSeq->size--;
return;
}
void Insert(SeqList* pSeq,size_t pos,DataType x)//指定位置插入
{
assert(pSeq);
size_t i = pSeq->size;
if (pSeq->size == MAX)
{
printf("线性表已满,无法插入\n");
return;
}
for (; i >=pos-1; i--)
{
pSeq->array[i] = pSeq->array[i - 1];
}
pSeq->array[pos - 1] = x;
pSeq->size++;
}
int Find(SeqList* pSeq, DataType x)//查找第一个元素
{
assert(pSeq);
size_t i = 0;
for (; i < pSeq->size; i++)
{
if (pSeq->array[i] == x)
return i+1;
}
return -1;
}
void Erase(SeqList* pSeq, size_t pos )//删除指定位置的元素
{
assert(pSeq);
if (pSeq->size == 0)
{
printf("线性表为空,无法删除\n");
return;
}
if (pos > pSeq->size)
{
printf("给出位置不在线性表之内,无法删除\n");
return;
}
size_t i = pos-1;
for (; i <pSeq->size; i++)
{
pSeq->array[i] = pSeq->array[i+1];
}
pSeq->size--;
}
void Remove(SeqList* pSeq, DataType x)//删除第一个元素
{
Erase(pSeq, Find(pSeq,x));
}
void RemoveAll(SeqList* pSeq, DataType x)//删除全部相同元素
{
assert(pSeq);
size_t i = 0; 
size_t count = 0;
for (; i < pSeq->size; i++)
{
if (pSeq->array[i] == x)
{
count++;
}
else
{
pSeq->array[i - count] = pSeq->array[i];
}
}
pSeq->size -= count;
}
void BubbleSort(SeqList* pSeq)//冒泡排序
{
assert(pSeq);
size_t i = 0;
size_t j = 0;
for (; i < pSeq->size; i++)
{
for (j = 0; j < pSeq->size - i -1; j++)
{
if (pSeq->array[j]>pSeq->array[j + 1])
{
Swap(&pSeq->array[j], &pSeq->array[j + 1]);
}
}
}
}
void SeclectSort(SeqList* pSeq)//选择排序
{
size_t min;
size_t i = 0;
size_t j = 0;
for (; i < pSeq->size; i++)
{
min = i;
for (j = min; j < pSeq->size; j++)
{
if (pSeq->array[min]>pSeq->array[j])
{
min = j;
}
}
Swap(&pSeq->array[i], &pSeq->array[min]);
}
}

测试代码:

#include <stdio.h>
#include "Seqlist.h"
void test1(SeqList*pSeq)//测试代码
{
InitSeqList(pSeq);
PrintSeqList(pSeq);
PushBack(pSeq, 1);
PushBack(pSeq, 2);
PushBack(pSeq, 3);
PushBack(pSeq, 4);
PushBack(pSeq, 5);
PushBack(pSeq, 5);
PrintSeqList(pSeq);
PopBack(pSeq);
PopBack(pSeq);
PopBack(pSeq);
PopBack(pSeq);
PopBack(pSeq);
PopBack(pSeq);
PrintSeqList(pSeq);
PushFront(pSeq, 5);
PushFront(pSeq, 4);
PushFront(pSeq, 3);
PushFront(pSeq, 2);
PushFront(pSeq, 1);
PushFront(pSeq, 1);
PrintSeqList(pSeq);
}
void test2(SeqList*pSeq)
{
InitSeqList(pSeq);
PushBack(pSeq, 1);
PushBack(pSeq, 2);
PushBack(pSeq, 3);
PushBack(pSeq, 4);
PushBack(pSeq, 5);
PrintSeqList(pSeq);
PopFront(pSeq);
PopFront(pSeq);
PopFront(pSeq);
PopFront(pSeq);
PopFront(pSeq);
PopFront(pSeq);
}
void test3(SeqList*pSeq)
{
InitSeqList(pSeq);
PushBack(pSeq, 1);
PushBack(pSeq, 3);
PushBack(pSeq, 4);
PushBack(pSeq, 5);
PrintSeqList(pSeq);
Insert( pSeq,2,2);
PrintSeqList(pSeq);
Insert(pSeq, 2, 2);
}
void test4(SeqList*pSeq)
{
InitSeqList(pSeq);
PushBack(pSeq, 1);
PushBack(pSeq, 2);
PushBack(pSeq, 3);
PushBack(pSeq, 4);
PushBack(pSeq, 5);
PrintSeqList(pSeq);
Erase(pSeq, 2);
PrintSeqList(pSeq);
Erase(pSeq, 5);
PrintSeqList(pSeq);
}
void test5(SeqList*pSeq)
{
InitSeqList(pSeq);
PushBack(pSeq, 1);
PushBack(pSeq, 2);
PushBack(pSeq, 3);
PushBack(pSeq, 1);
PushBack(pSeq, 5);
PrintSeqList(pSeq);
RemoveAll(pSeq, 1);
PrintSeqList(pSeq);
}
void test6(SeqList*pSeq)//冒泡排序验证
{
InitSeqList(pSeq);
PushBack(pSeq, 2);
PushBack(pSeq, 4);
PushBack(pSeq, 3);
PushBack(pSeq, 1);
PushBack(pSeq, 5);
PrintSeqList(pSeq);
BubbleSort(pSeq);
PrintSeqList(pSeq);
}
void test7(SeqList*pSeq)
{
InitSeqList(pSeq);
InitSeqList(pSeq);
PushBack(pSeq, 2);
PushBack(pSeq, 4);
PushBack(pSeq, 3);
PushBack(pSeq, 1);
PushBack(pSeq, 5);
PrintSeqList(pSeq);
SeclectSort(pSeq);
PrintSeqList(pSeq);
}
int main()
{
SeqList SL;
test1(&SL);
test2(&SL);
test3(&SL);
printf("%d\n", Find(&SL, 5));
test4(&SL);
test5(&SL);
test6(&SL);
test7(&SL);
system("pause");
return 0;
}

如有不足希望批评指正

时间: 2024-10-06 05:11:28

C语言实现顺序表的增删查改以及排序的相关文章

C++实现静态顺序表的增删查改以及初始化

C++实现静态顺序表的增删查改 顺序表:用一段地址连续的存储单元依s次存储数据元素的线性结构,是线性表的一种. //SeqList.h #pragma once #include <assert.h> #include <string.h> #define MAX_SIZE 5 typedef int DataType; //定义顺序表结构体 typedef struct SeqList { DataType array[MAX_SIZE];  //数据块数组 size_t siz

顺序表的增删查改、二分查找、冒泡和快速排序

SeqList 声明文件 #pragma once #define MAX_SIZE 5 typedef int DataType; typedef struct SeqList { DataType array[MAX_SIZE]; size_t size; }SeqList; void PrintSeqList(SeqList* pSeq); void InitSeqList(SeqList* pSeq);//初始化 void PushBack(SeqList* pSeq, DataType

list的增删查改及其排序

''' #list的增删查改及其排序 #列表的增 list=["hello","Linda",13,"welcome","to","China"] #list的增 a=list.append("Chichy")#增加字符串 print(list) b=list.append(123)#增加数字 print(list) c=list.append([1,2,3,4])#增加列表 print

go语言操作mysql范例(增删查改)

http://blog.csdn.net/jesseyoung/article/details/40398321 go语言连接mysql简介    go官方仅提供了database package,database package下有两个包sql,sql/driver.这两个包用来定义操作数据库的接口,这就保证了无论使用哪种数据库,他们的操作方式都是相同的.    但go官方并没有提供连接数据库的driver,如果要操作数据库,还需要第三方的driver 包,最常用的有:    https://

2.MyBatis对数据库单表的增删查改

转自: http://www.cnblogs.com/xdp-gacl/p/4262895.html 一.使用MyBatis对表执行CRUD操作——基于XML的实现 1.定义sql映射xml文件 userMapper.xml文件的内容如下: 1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0/

表的增删查改

var db=window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; var request, result, version=2, dbName = 'textDB', osName = 'its'; function createDB(){ request=db.open(dbName,version); request.onsuccess=function(){ db

python-列表的增删查改

转自:https://www.cnblogs.com/liuyam/p/6270062.html 列表是最常用的数据类型之一,通过列表可以对数据实现方便的存储,修改等操作. 先声明一个空列表: >>> names = [] >>> names [] 可以存多个值: >>> names = ["wangwang","maomao"] >>> names ['wangwang', 'maomao']

65.十一级指针实现百万qq号的增删查改以及排序写入

运行结果: 内存使用情况: 写入文件排序好的数据: 创建文件地址以及创建十一级指针 1 char *path = "QQ.txt"; 2 char *sortpath = "QQchiguowei2018.txt"; 3 //创建十一级指针 4 char *********** allP = NULL; 初始化十一级指针 1 //初始化 2 void init() 3 { 4 5 FILE *pf = fopen(path, "r"); 6 if

c++中的顺序表写法,主要实现(增删查改,构造函数,运算符重载)

本文的内容主要是,利用c++写出顺序表,并对写出的代码进行测试, 主要实现的功能:实现对顺序表的增删查改, 要写的函数:构造函数,赋值运算符重载,析构函数.在编写代码过程中应注意到深浅拷贝问题. 下面是顺序表的类函数: #pragma once #include<iostream> using namespace std; typedef int DataType; class SeqList { public: SeqList(); SeqList(DataType *array, size