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

一、数据之间关系

二、数据结构

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值