当前位置: 首页 > article >正文

数据结构(顺序表、链式表)

一、数据之间关系

二、数据结构

1.顺序表

顺序表功能实现

#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;
    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--)
    {
        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
2.链式表

链式表功能实现

#include"linklist.h"

//创建链表
LinkNode *CreateLinkList(void)
{
    LinkNode *pHead = NULL;

    pHead = malloc(sizeof(LinkNode));
    if(NULL == pHead)
    {
        return NULL;
    }

    pHead->pNext = NULL;

    return pHead;
}

//头插法
int HeadInsertLinkList(LinkNode *pHead,DataType TmpData)
{
    LinkNode *pNewNode = NULL;
    /*申请空间*/
    pNewNode = malloc(sizeof(LinkNode));
    if(NULL == pNewNode)
    {
        return -1;
    }

    //对两个成员分别赋初值
    pNewNode->Data = TmpData;
    pNewNode->pNext = pHead->pNext;

    //头结点的pNext指向新申请节点
    pHead->pNext = pNewNode;

    return 0;
}

//打印链表
int ShowLinkList(LinkNode *pHead)
{
    LinkNode *p = NULL;
    
    p = pHead->pNext;

    while(p != NULL)
    {
            printf("%d  \n",p->Data);
            p = pHead->pNext;
    }
    printf("\n");

    return 0;
}


//修改链表
int UpdateLinkList(LinkNode *pHead,DataType OldData, DataType NewData)
{
    LinkNode *p = NULL;
    int i = 0;
    p = pHead->pNext;

    while(p != NULL)
    {
          if (p->Data = OldData)
         {
             p->Data = NewData;
             i++;
         }
         p = pHead->pNext;

    }
    printf("\n");


    return 0;
}

头文件为

#ifndef __LINKLIST_H__
#define __LINKLIST_H__

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//存放数据的类型
typedef int DataType;

//链表节点类型
typedef struct node
{
    DataType Data;
    struct node *pNext;
}LinkNode;

extern LinkNode *CreateLinkList(void);
extern int HeadInsertLinkList(LinkNode *pHead,DataType TmpData);
extern int ShowLinkList(LinkNode *pead);
extern int UpdateLinkList(LinkNode *pHead,DataType OldData, DataType NewData);

#endif


http://www.kler.cn/a/286013.html

相关文章:

  • 微信小程序App实现小车方向控制
  • Webpack中的自定义 loader 的简单实现
  • Python酷库之旅-第三方库Pandas(113)
  • HarmonOS实战开发:Node-API接口适配模块加载指导
  • HTTP/2
  • 讲个SystemVerilog disable语句的坑
  • js实现3d拖拽环绕旋转
  • 基于Material Design风格开源的Avalonia UI控件库
  • 在国产芯片上实现YOLOv5/v8图像AI识别-【4.1】RK3588训练数据时进行图像增强更多内容见视频
  • 力扣1235.规划兼职工作
  • 大阪OSAKA分子泵电源TC163HTC203TC353TC523TC1104TC553TC1813手侧
  • 地理空间查询的奥秘:SQL中的高效数据探索
  • OpenAI GPT3 Search API not working locally
  • MySQL数据库规范化:避免数据冗余与保持数据一致性
  • Python酷库之旅-第三方库Pandas(114)
  • 5.4二叉树——经典OJ题
  • 【扩散模型(七)】IP-Adapter 与 IP-Adapter Plus 的具体区别是什么?
  • python安装protobuf记录
  • 第十三章 rust日志库使用介绍
  • STL-常用容器