C语言数据结构 线性表的基本功能实现

头文件如下

#ifndef _SEQLIST_H_
#define _SEQLIST_H_

// 顺序表的动态存储

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int SLDataType;

typedef struct SeqList {
    SLDataType* array;  // 指向动态开辟的数组
    size_t size;       // 有效数据个数
    size_t capacity;   // 容量空间的大小
}SeqList;

// 基本增删查改接口
void SeqListInit(SeqList* psl, size_t capacity);
void SeqListDestory(SeqList* psl);

void CheckCapacity(SeqList* psl);
void SeqListPushBack(SeqList* psl, SLDataType x);
void SeqListPopBack(SeqList* psl);
void SeqListPushFront(SeqList* psl, SLDataType x);
void SeqListPopFront(SeqList* psl);

int SeqListFind(SeqList* psl, SLDataType x);
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x);
void SeqListErase(SeqList* psl, size_t pos);
void SeqListRemove(SeqList* psl, SLDataType x);
void SeqListModify(SeqList* psl, size_t pos, SLDataType x);
void SeqListPrint(SeqList* psl);

void SeqListBubbleSort(SeqList* psl);
int SeqListBinaryFind(SeqList* psl, SLDataType x);
void SeqListRemoveAll(SeqList* psl, SLDataType x);

#endif /*_SEQLIST_H_*/

以下是具体功能实现

void SeqListInit(SeqList* psl, size_t capacity)//初始化
{
    psl->array = (SLDataType*)calloc(capacity, sizeof(SLDataType));
    psl->capacity = capacity;
    psl->size = 0;
}
void SeqListDestory(SeqList* psl)
{
    if (psl->array)
    {
        free(psl->array);
        psl->array = NULL;
        psl->capacity = 0;
        psl->size = 0;
    }
}

void CheckCapacity(SeqList* psl)//检查和动态开辟
{
    if (psl->size >= psl->capacity)
    {
        psl->capacity *= 2;
        psl->array = (SLDataType*)realloc(psl->array, sizeof(SLDataType)*psl->capacity);
    }
}
void SeqListPushBack(SeqList* psl, SLDataType x)//尾插
{
    CheckCapacity(psl);
    psl->array[psl->size] = x;
    psl->size++;
}
void SeqListPopBack(SeqList* psl)//尾删
{
    psl->size--;
}
void SeqListPushFront(SeqList* psl, SLDataType x)//首插
{
    int i;
    CheckCapacity(psl);
    for (i = psl->size - 1; i >= 0; i--)
    {
        psl->array[i+1] = psl->array[i];

    }
    psl->array[0] = x;
    psl->size++;
}
void SeqListPopFront(SeqList* psl)//首删
{
    size_t i;
    for (i = 0; i < psl->size-1; i++)
    {
        psl->array[i] = psl->array[i + 1];
    }
    psl->size--;
}

int SeqListFind(SeqList* psl, SLDataType x)//查询
{
    size_t i;
    for (i = 0; i < psl->size - 1; i++)
    {
        if (psl->array[i] == x)
        {
            return i;
        }
    }
    return -1;
}
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x)//插入
{
    size_t i;
    for (i=psl->size-1; i>=pos; i--)
    {
        psl->array[i+1] = psl->array[i];
    }
    psl->array[pos] = x;
    psl->size++;
}
void SeqListErase(SeqList* psl, size_t pos)//删除指定下标
{
    size_t i;
    for (i = pos; i < psl->size - 1; i++)
    {
        psl->array[i] = psl->array[i + 1];
    }
    psl->size--;
}
void SeqListRemove(SeqList* psl, SLDataType x)//筛选删除
{
    SeqListErase(psl, SeqListFind(psl, x));
}
void SeqListModify(SeqList* psl, size_t pos, SLDataType x)
{
    psl->array[pos] = x;
}
void SeqListPrint(SeqList* psl)
{
    size_t i;
    for (i = 0; i <=psl->size - 1; i++)
    {
        if (psl->array == NULL)
        {
            printf("NULL");
            return;
        }
        printf("%d->", psl->array[i]);
    }
    putchar(‘\n‘);
}

void SeqListBubbleSort(SeqList* psl)
{
    size_t i, j;
    SLDataType tmp;
    for (i = 0; i < psl->size - 1; i++)
    {
        for (j = 0; j < psl->size - 1; j++)
        {
            if (psl->array[j] > psl->array[j + 1])
            {
                tmp = psl->array[j];
                psl->array[j] = psl->array[j + 1];
                psl->array[j + 1] = tmp;
            }
        }
    }
}
int SeqListBinaryFind(SeqList* psl, SLDataType x)
{
    int left = 0, right = psl->size;
    int mid = (left + right) / 2;
    while (left <= right)
    {
        if (x < psl->array[mid])
        {
            right = mid-1;
        }
        if (x>psl->array[mid])
        {
            left = mid+1;
        }
        else
        {
            return mid;
        }
    }
    return -1;
}
void SeqListRemoveAll(SeqList* psl, SLDataType x)
{
    size_t i, gap = 0;
    for (i = 0; i < psl->size; i++)
    {
        if (psl->array[i] == x)
        {
            gap++;
        }
        else
        {
            psl->array[i - gap] = psl->array[i];
        }
    }
    psl->size -= gap;
}

原文地址:https://blog.51cto.com/14232799/2422304

时间: 2024-10-11 18:43:51

C语言数据结构 线性表的基本功能实现的相关文章

数据结构线性表链表的C语言实现

                                                                                      数据结构线性表链表的C语言实现      说明:线性表是一种最简单的线性结构,也是最基本的一种线性结构,所以它不仅是学习中的重点,也是应用开发非常常用的一种数据结构.它可以分为顺序表和链表.它的主要操作是数据元素的插入,删除,以及排序等.接下来,本篇文章将对线性表链表的基本操作和运用进行详细的说明(包含在源代码的注释中),并给

java实现数据结构-线性表-顺序表,实现插入,查找,删除,合并功能

package 顺序表; import java.util.ArrayList; import java.util.Scanner; public class OrderList { /** * @param args * @author 刘雁冰 * @2015-1-31 21:00 */ /* * (以下所谓"位置"不是从0开始的数组下标表示法,而是从1开始的表示法.) * (如12,13,14,15,16数据中,位置2上的数据即是13) * * 利用JAVA实现数据结构-线性表-顺

数据结构线性表初接触1:线性表的顺序存储结构下基本运算的实现

刚刚接触数据结构这学问,通过听课看书后自行练习了用C语言实现线性表的基本运算,其中有许多点值得注意.这里存储各个功能分块的代码,以便自身的理解及以后的复习: 1 typedef int ElemType; 2 #define MaxSize 50 3 typedef struct { 4 ElemType data[MaxSize]; 5 int length; 6 }SqList; 7 void CreateList(SqList *&L,ElemType a[],int n){ 8 int

数据结构-线性表_顺序表

进入大学一年了,今日终于有勇气写写随笔并展示出来了. 如有不足之处,请大家指正. 今日我想写的就是我对数据结构-线性表_顺序表的理解. 不BB了,进入正题!!!!! 数据结构中的逻辑结构分为线性结构和非线性结构,而线性表就属于线性结构. 线性结构是 n 个数据元素的有序(次序)集合,它有下列几个特征: 集合中必存在唯一的一个 "第一个元素": 集合中必存在唯一的一个 "最后的元素": 除最后元素之外,其它数据元素均有唯一的 "后继": 除第一元素

使用C语言实现线性表

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

数据结构线性表插入删除的示例

昨天留的作业,数据结构书和c语言书真的不一样,需要自己加加补补,今天写的时候迷迷瞪瞪的,反正在我电脑上能用. 数据结构线性表插入删除的示例: 代码: #include<iostream> #include<cstdio> using namespace std; #define list_init_size 100 #define listincrement 10 typedef struct { int *elem; int length; int listsize; }sqli

[考研系列之数据结构]线性表之队列

基本概念 队列的定义 队列是一种只能在表的一头插入,另一头删除的线性表,简而言之具有FIFO的特性 组成 队头 队尾 扩展 双端队列 只能在两端进行删除插入操作的线性表 实现 链队列 顺序队列 循环队列 循环队列 循环队列是将顺序队列臆造成一个环,如图 循环队列有以下参数 front 指向队头的指针 rear 指向队尾的指针 SIZE 循环最大队列长度 对于循环队列,初始状态的时候 front=rear=0; 每次insert的时候 Insert((front++)%SIZE); 那么,当循环队

[考研系列之数据结构]线性表之栈

?基本概念 栈的定义 限定仅在表尾进行插入或删除的线性表 组成 栈顶 栈底 基本操作 入栈(PUSH) 往栈中插入一个元素 弹栈(POP) 从栈顶删除一个元素 栈的表示 顺序栈 链栈 对于顺序栈,有两个指针base和top base指向栈底 top指向栈顶 对于栈的一些基本情况: 栈不存在时候 base=NULL 栈为空时  top=base 栈的长度 top-base 链栈略过. 栈的应用 1 数制转换 数制转换我们使用一种称之为"辗转相除法"的算法.此算法的基本原理基于: N=(N

[考研系列之数据结构]线性表之字符串

基本概念 串(字符串)  由0个或多个字符组成的有限序列,例如s="hello world" 串名  上例中的s 子串  某串任意连续字符组成的子序列,称为此字符串的子串 空串  0个字符的串,s="" 空格串  由一个或多个字符组成的串 模式匹配算法 作用 定位某子串T在字符串S中的位置 主串 S 模式串  T 针对模式匹配算法从简到难我们需要了解两种算法: [1] 朴素的模式匹配算法 [2] KMP匹配算法 朴素的模式匹配算法: 所谓朴素就是简单,这是一种简单的