数据结构(顺序表、链式表)
一、数据之间关系
二、数据结构
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