数据结构—顺序表

数据结构:

1.衡量一个程序是否优秀:
    1.时间复杂度:
        数据量增长与程序运行时间的比例关系以函数描述称为时间渐进复杂度函数,简称时间复杂度
        O(c) > O(logn) > O(n) > O(nlogn) > O(n^2) > O(n^3) > O(2^n)
    2.空间复杂度:
        数据量增长与程序所占用空间的比例关系称为空间复杂度

2.数据结构:
    数据之间的关系 
        逻辑结构:
            1. 线性结构
                一对一 表
            2. 非线性结构
                一对多 树 
                多对多 图
        
        存储结构:
            1. 顺序存储结构
            2. 链式存储结构
            3. 离散存储
            4. 索引存储

3.程序:
    程序 = 数据结构 + 算法

4.数据结构: 
    顺序表
    链式表
    顺序栈
    链式栈
    顺序队列
    链式队列 
    树 
    二叉树
    常见的排序查找算法

    安装内存泄露检测工具:
    sudo apt-get install valgrind

    检测方法:
    valgrind --tool=memcheck --leak-check=full ./a.out

5.顺序表:

#include "seqlist.h"
#include <stdlib.h>
#include <stdio.h>

//创建顺序表
SeqList *CreateSeqList(int MaxLen)
{
    SeqList *pTmpList = NULL;

    //1.申请标签空间
    pTmpList = malloc(sizeof(*pTmpList));
    if (NULL == pTmpList)
    {
        return NULL;
    }

    //2.对标签中的所有成员赋值
    pTmpList->cLen = 0;
    pTmpList->tLen = MaxLen;
    
    //3.申请存放数据的空间
    pTmpList->pData = malloc(MaxLen * sizeof(DataType));
    if (NULL == pTmpList->pData)
    {
        return NULL;
    }

    //4.返回标签首地址

    return pTmpList;
}

//顺序表是否已满
int IsFullSeqList(SeqList *pTmpList)
{
    return pTmpList->cLen == pTmpList->tLen ? 1 : 0;
}

//顺序表是否为空
int IsEmptySeqList(SeqList *pTmpList)
{
    return pTmpList->cLen == 0 ? 1 : 0;
}

//获得顺序表中元素个数
int GetCountSeqList(SeqList *pTmpList)
{
    return pTmpList->cLen;
}

//获得顺序表中元素的容量
int GetCapacitySeqList(SeqList *pTmpList)
{
    return pTmpList->tLen;
}

//末尾添加
int AppendSeqList(SeqList *pTmpList, DataType TmpData)  //插入数据 直接是数据
{
    if (IsFullSeqList(pTmpList))
    {
        return -1;
    }

    pTmpList->pData[pTmpList->cLen] = TmpData; //当前指向的clen就是下次插入的位置
    pTmpList->cLen++;

    return 0;
}

//指定位置插入
//注意:
//  返回-1  表示顺序表已满
//  返回-2  表示插入数据的位置错误
int PosInsertSeqList(SeqList *pTmpList, int Pos, DataType TmpData)
{
    int n = 0;

    if (IsFullSeqList(pTmpList))
    {
        return -1;
    }

    //错误的插入位置
    if (!(Pos >= 0 && Pos <= pTmpList->cLen))
    {
        return -2;
    }

    for (n = pTmpList->cLen; n > Pos; n--) //0开始,指定位置插入,将从后边开始所有元素值依次向下移动
    {
        pTmpList->pData[n] = pTmpList->pData[n-1];
    }
    pTmpList->pData[Pos] = TmpData;
    pTmpList->cLen++;

    return 0;
}

//元素遍历
//参数:
//   pFun:对遍历到的每个数据的操作方法
//   arg:对pFun函数的传参
//返回值:
//   成功返回0 
//   失败返回-1 
int ForeachSeqList(SeqList *pTmpList, int (*pFun)(void *Element, void *arg), void *arg)
{
    int i = 0;
    int ret = 0;

    for (i = 0; i < pTmpList->cLen; i++)
    {
        ret = pFun(&pTmpList->pData[i], arg);
        if (ret != 0)
        {
            return -1;
        }
    }

    return 0;
}

//删除
int DeleteSeqList(SeqList *pTmpList, int Pos)
{
    int i = 0;
    int n = 0;

    if (IsEmptySeqList(pTmpList))
    {
        return -1;
    }

    if (!(Pos >= 0 && Pos < pTmpList->cLen))
    {
        return -2;
    }

    for (n = Pos; n < pTmpList->cLen-1; n++)
    {
        pTmpList->pData[n] = pTmpList->pData[n+1];
    }
    pTmpList->cLen--;

    return 0;
}

//清0
int ClearSeqList(SeqList *pTmpList)
{
    pTmpList->cLen = 0;

    return 0;
}

//销毁
int DestroySeqList(SeqList **ppTmpList)
{
    free((*ppTmpList)->pData);
    free((*ppTmpList));
    *ppTmpList = NULL;

    return 0;
}
#ifndef __SEQLIST_H__
#define __SEQLIST_H__

//存储数据类型 
typedef int DataType;

//顺序表标签结构
typedef struct list
{
    DataType *pData;        //存放数据空间首地址
    int tLen;               //最大存放元素个数
    int cLen;               //当前元素个数
}SeqList;

extern SeqList *CreateSeqList(int MaxLen);
extern int IsEmptySeqList(SeqList *pTmpList);
extern int IsFullSeqList(SeqList *pTmpList);
extern int GetCountSeqList(SeqList *pTmpList);
extern int GetCapacitySeqList(SeqList *pTmpList);
extern int AppendSeqList(SeqList *pTmpList, DataType TmpData);
extern int PosInsertSeqList(SeqList *pTmpList, int Pos, DataType TmpData);
extern int ForeachSeqList(SeqList *pTmpList, int (*pFun)(void *Element, void *arg), void *arg);
extern int DeleteSeqList(SeqList *pTmpList, int Pos);
extern int ClearSeqList(SeqList *pTmpList);
extern int DestroySeqList(SeqList **ppTmpList);

#endif
#include "seqlist.h"
#include <stdio.h>

int ShowFun(void *pElement, void *arg)
{   
    int *pData = pElement;

    printf("%d ", *pData);

    return 0;
}

int UpdateFun(void *pElement, void *arg)
{
    int *pData = pElement;

    if (*pData == 4)
    {
        *pData = 40;
    }

    return 0;
}

int FindFun(void *pElement, void *arg)
{
    int *pData = pElement;

    if (*pData == 30)
    {
        return 1;
    }
    else 
    {
        (*(int *)arg)++;
    }

    return 0;
}

int main(void)
{
    SeqList *pseqlist = NULL;
    int val = 0;
    int n = 0;

    pseqlist = CreateSeqList(10);
    AppendSeqList(pseqlist, 1);
    AppendSeqList(pseqlist, 2);
    AppendSeqList(pseqlist, 3);
    AppendSeqList(pseqlist, 4);
    AppendSeqList(pseqlist, 5);
    PosInsertSeqList(pseqlist, 0, 10);
    PosInsertSeqList(pseqlist, 3, 30);

    printf("===============================\n");
    printf("顺序表当前元素个数:%d/%d\n", GetCountSeqList(pseqlist), GetCapacitySeqList(pseqlist));
    printf("===============================\n");
    printf("元素内容:\n");
    ForeachSeqList(pseqlist, ShowFun, NULL);
    printf("\n");
    printf("===============================\n");
    printf("修改元素:\n");
    ForeachSeqList(pseqlist, UpdateFun, NULL);
    printf("===============================\n");
    printf("元素内容:\n");
    ForeachSeqList(pseqlist, ShowFun, NULL);
    printf("\n");
    printf("===============================\n");
    printf("查找元素:\n");
    n = 0;
    ForeachSeqList(pseqlist, FindFun, &n);
    printf("n = %d\n", n);
    printf("===============================\n");
    printf("删除元素:\n");
    n = 0;
    ForeachSeqList(pseqlist, FindFun, &n);
    DeleteSeqList(pseqlist, n);
    DeleteSeqList(pseqlist, 0);
    DeleteSeqList(pseqlist, GetCountSeqList(pseqlist)-1);
    printf("===============================\n");
    printf("元素内容:\n");
    ForeachSeqList(pseqlist, ShowFun, NULL);
    printf("\n");
    printf("===============================\n");
    ClearSeqList(pseqlist);
    printf("元素内容:\n");
    ForeachSeqList(pseqlist, ShowFun, NULL);
    printf("\n");
    printf("===============================\n");
    DestroySeqList(&pseqlist);
    printf("pseqlist = %p\n", pseqlist);

    return 0;
}

6.链表:
    1.空间可以不连续,访问元素不方便
    2.链表需要更大的空间存放数据和节点地址
    3.链表空间不连续,使得理论上长度是无限的
    4.链表的插入和删除效率很高

    链表的分类:
        1.单向链表
        2.双向链表
        3.循环链表
        4.内核链表
        

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
顺序表是一种常见的数据结构,用于存储一组具有相同类型的元素。它的基本操作包括创建、查找、插入和删除等。 在C语言中,可以通过使用数组来实现顺序表。我们可以定义一个数组来存储顺序表的元素,然后通过索引来访问和操作其中的元素。引用中的代码展示了一个简单的顺序表的例子,它使用了C语言来实现。在这个例子中,我们可以看到如何创建一个顺序表、插入元素、删除元素以及查找元素的前驱和后继。 引用中的代码是一个测试顺序表基本操作的例子。它使用了一个自定义的List类来实现顺序表,并对其进行了各种操作,包括插入元素、删除元素、查找元素的前驱和后继以及遍历整个顺序表顺序表的结构体定义可以根据具体的需求进行定义。在引用中的代码中,定义了一个结构体ConnTimeout,其中包含了一个int类型的fd和一个time_t类型的timeout成员变量。这个结构体可以用来表示连接超时的信息。 总而言之,顺序表是一种常见的数据结构,可以通过使用数组来实现。在C语言中,可以使用数组和相关的操作来创建、查找、插入和删除顺序表中的元素。结构体的定义可以根据具体的需求进行自定义。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [数据结构顺序表c++代码](https://download.csdn.net/download/qq_46546083/13458006)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [C++数据结构顺序表(模板类实现)](https://blog.csdn.net/sagjhdj/article/details/123260460)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [【数据结构顺序表(C++)](https://blog.csdn.net/qq_51604330/article/details/120600041)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值