线性表的增加C语言实现,数据结构(严蔚敏)C语言实现---线性表的顺序存储

总觉得写的代码差点什么,所以回过头开始看数据结构,真正去实现一下。

这次看的是线性表的顺序存储,代码如下:

1、为了增加代码可读性,用了一些宏定义,文件名称为BaseDefine.h,内容如下:

#ifndef BASE_DEFINE_H

#define BASE_DEFINE_H

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

typedef int Status;

typedef int bool;

#endif2、线性表头文件,名称为SequenceList.h,内容如下:

#ifndef SEQUENCE_LIST_H

#define SEQUENCE_LIST_H

#include "BaseDefine.h"

#define LIST_INIT_SIZE 100

#define LIST_INCREMENT 10

typedef int ElemType;

typedef struct

{

ElemType* pBase;

int length;

int listSize;

}SqList;

//The pointer of function

typedef bool (*pFunCompare)(ElemType elemA,ElemType elemB);

typedef Status (*pFunVisit)(ElemType elem);

Status InitList_Sq(SqList *pSqList);

Status DestoryList_Sq(SqList *pSqList);

Status ClearList_Sq(SqList *pSqList);

bool ListEmpty_Sq(const SqList sqList);

int ListLength_Sq(const SqList sqList);

Status GetElem_Sq(const SqList sqList,int location,ElemType *elem);

int LocateElem_Sq(const SqList sqList,const ElemType e,pFunCompare comFun);

Status PriorElem(const SqList sqList,const ElemType curElem,ElemType *preElem);

Status NextElem(const SqList sqList,const ElemType curElem,ElemType *nextElem);

Status InsertList_Sq(SqList *pSqList,int insertLocation,const ElemType elem);

Status ListDelete_Sq(SqList *pSqList,int deleteLocation,ElemType *pElem);

Status ListTraverse(SqList sqList,pFunVisit visitFun);

bool compareElem(const ElemType elemA,const ElemType elemB);

Status visitElem(const ElemType elem);

Status copyElem(ElemType *dstElem,const ElemType srcElem);

void printList_Sq(const SqList sqList);

#endif

3、线性表的实现,名称为SequenceList.c,内容如下:

#include "SequenceList.h"

#include #include #include #include Status InitList_Sq(SqList * pSqList)

{

pSqList->pBase = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));

if(!pSqList->pBase)

exit(OVERFLOW);

memset(pSqList->pBase,0,LIST_INIT_SIZE * sizeof(ElemType));

pSqList->length = 0;

pSqList->listSize = LIST_INIT_SIZE;

}

Status DestoryList_Sq(SqList * pSqlist)

{

if(!pSqlist->pBase)

{

free(pSqlist->pBase);

pSqlist->pBase = NULL;

}

pSqlist->length = 0;

pSqlist->listSize = 0;

return TRUE;

}

Status ClearList_Sq(SqList * pSqList)

{

//how to judge the sq list is exist or not?

pSqList->length = 0;

memset(pSqList->pBase,0,pSqList->listSize * sizeof(ElemType));

return OK;

}

bool ListEmpty_Sq(const SqList sqList)

{

if(0 == sqList.length)

return TRUE;

return FALSE;

}

int ListLength_Sq(const SqList sqList)

{

return sqList.length;

}

Status GetElem_Sq(const SqList sqList, int location, ElemType * elem)

{

if((location < 1) || (location > sqList.length))

return ERROR;

copyElem(elem,sqList.pBase[location - 1]);

return OK;

}

int LocateElem_Sq(const SqList sqList, const ElemType e, pFunCompare comFun)

{

int i = 0;

for(i = 0;i < sqList.length;i++)

{

if(comFun(sqList.pBase[i],e))

return i + 1;

}

return INFEASIBLE;

}

Status PriorElem(const SqList sqList, const ElemType curElem, ElemType * preElem)

{

int location = LocateElem_Sq(sqList,curElem,compareElem);

if(location > 1)

{

copyElem(preElem,sqList.pBase[location - 1 - 1]);

return OK;

}

return ERROR;

}

Status NextElem(const SqList sqList, const ElemType curElem, ElemType * nextElem)

{

int location = LocateElem_Sq(sqList,curElem,compareElem);

if(location < sqList.length)

{

copyElem(nextElem,sqList.pBase[location - 1 + 1]);

return OK;

}

return ERROR;

}

Status InsertList_Sq(SqList * pSqList, int insertLocation,const ElemType e)

{

ElemType * p_new_base = NULL;

int i = 0;

if((insertLocation < 1) || (insertLocation > (pSqList->length) + 1))

return ERROR;

if(pSqList->length >= pSqList->listSize)

{

p_new_base = (ElemType *)realloc(pSqList->pBase,(pSqList->listSize + LIST_INCREMENT)*sizeof(ElemType));

if(!p_new_base)

exit(OVERFLOW);

pSqList->listSize += LIST_INCREMENT;

pSqList->pBase = p_new_base;

}

for(i = (pSqList->length - 1);i >= insertLocation - 1;i-- )

{

pSqList->pBase[i + 1] = pSqList->pBase[i];

}

pSqList->pBase[insertLocation - 1] = e;

pSqList->length++;

}

Status ListDelete_Sq(SqList * pSqList, int deleteLocation, ElemType * pElem)

{

int i = 0;

if((deleteLocation < 1) || (deleteLocation > pSqList->length))

return ERROR;

(*pElem) = pSqList->pBase[deleteLocation - 1];

for(i = deleteLocation;i < pSqList->length;i++)

{

pSqList->pBase[i - 1] = pSqList->pBase[i];

}

pSqList->length--;

return OK;

}

Status ListTraverse(SqList sqList, pFunVisit visitFun)

{

int i = 0;

for(i = 0;i < sqList.length;i++)

{

visitFun(sqList.pBase[i]);

}

}

bool compareElem(const ElemType elemA,const ElemType elemB)

{

return (elemA == elemB) ? TRUE:FALSE;

}

Status visitElem(const ElemType elem)

{

printf("Fun visit:the elem value is [%d]\n",elem);

}

Status copyElem(ElemType * dstElem, const ElemType srcElem)

{

*dstElem = srcElem;

}

void printList_Sq(const SqList sqList)

{

int i = 0;

if(!sqList.pBase)

exit(INFEASIBLE);

printf("Printf sqlist info start\n");

printf("SqList info:BaseAddr[%d],Length[%d],MallocSize[%d]\n",sqList.pBase,sqList.length,sqList.listSize);

for(i = 0;i < sqList.length;i++)

{

printf("Elem [%d],value[%d]\n",i + 1,sqList.pBase[i]);

}

printf("Printf sqlist info end\n");

}

4、调用这些方法,以验证是否正确,文件名main.c,内容如下:

#include #include "SequenceList.h"

int main()

{

SqList s_list;

ElemType elem;

ElemType preElem;

ElemType nextElem;

int i = 0;

printf("------------The main function start------------\n");

printf("------------InitList_Sq start------------\n");

InitList_Sq(&s_list);

printList_Sq(s_list);

printf("------------InitList_Sq end------------\n");

printf("------------InsertList_Sq start------------\n");

for(i = 1;i <= 110;i++)

{

InsertList_Sq(&s_list,1,i);

}

printList_Sq(s_list);

printf("------------InsertList_Sq end------------\n");

printf("------------ListDelete_Sq start------------\n");

for(i = 1;i <= 55;i++)

{

if(ListDelete_Sq(&s_list,i,&elem))

printf("Delete elem[%d],value[%d]\n",i,elem);

}

printList_Sq(s_list);

printf("------------ListDelete_Sq end------------\n");

printf("------------GetElem_Sq start------------\n");

GetElem_Sq(s_list,27,&elem);

printf("The location[%d] elem is [%d]\n",27,elem);

printf("------------GetElem_Sq end------------\n");

printf("------------LocateElem_Sq start------------\n");

printf("The elem[%d] location is [%d]\n",elem,LocateElem_Sq(s_list,elem,compareElem));

printf("------------LocateElem_Sq end------------\n");

printf("------------PriorElem start------------\n");

PriorElem(s_list,elem,&preElem);

printf("The elem[%d] preElem is [%d]\n",elem,preElem);

printf("------------PriorElem end------------\n");

printf("------------NextElem start------------\n");

NextElem(s_list,elem,&nextElem);

printf("The elem[%d] nextElem is [%d]\n",elem,nextElem);

printf("------------NextElem end------------\n");

printf("------------ListTraverse start------------\n");

ListTraverse(s_list,visitElem);

printf("------------ListTraverse end------------\n");

printf("------------ClearList_Sq start------------\n");

ClearList_Sq(&s_list);

printf("------------ClearList_Sq end------------\n");

printf("------------ListEmpty_Sq start------------\n");

if(ListEmpty_Sq(s_list))

{

printf("The list is empty\n");

}

else

{

printf("The list is not empty\n");

}

printf("------------ListEmpty_Sq end------------\n");

printf("------------DestoryList_Sq start------------\n");

DestoryList_Sq(&s_list);

printf("------------DestoryList_Sq end------------\n");

printf("------------The main function end------------\n");

return OK;

}

5、编译

gcc main.c SequenceList.c -o main

6、执行

./main

7、执行结果

------------The main function start------------

------------InitList_Sq start------------

Printf sqlist info start

SqList info:BaseAddr[18399248],Length[0],MallocSize[100]

Printf sqlist info end

------------InitList_Sq end------------

------------InsertList_Sq start------------

Printf sqlist info start

SqList info:BaseAddr[18399248],Length[110],MallocSize[110]

Elem [1],value[110]

Elem [2],value[109]

Elem [3],value[108]

Elem [4],value[107]

Elem [5],value[106]

Elem [6],value[105]

Elem [7],value[104]

Elem [8],value[103]

Elem [9],value[102]

Elem [10],value[101]

Elem [11],value[100]

Elem [12],value[99]

Elem [13],value[98]

Elem [14],value[97]

Elem [15],value[96]

Elem [16],value[95]

Elem [17],value[94]

Elem [18],value[93]

Elem [19],value[92]

Elem [20],value[91]

Elem [21],value[90]

Elem [22],value[89]

Elem [23],value[88]

Elem [24],value[87]

Elem [25],value[86]

Elem [26],value[85]

Elem [27],value[84]

Elem [28],value[83]

Elem [29],value[82]

Elem [30],value[81]

Elem [31],value[80]

Elem [32],value[79]

Elem [33],value[78]

Elem [34],value[77]

Elem [35],value[76]

Elem [36],value[75]

Elem [37],value[74]

Elem [38],value[73]

Elem [39],value[72]

Elem [40],value[71]

Elem [41],value[70]

Elem [42],value[69]

Elem [43],value[68]

Elem [44],value[67]

Elem [45],value[66]

Elem [46],value[65]

Elem [47],value[64]

Elem [48],value[63]

Elem [49],value[62]

Elem [50],value[61]

Elem [51],value[60]

Elem [52],value[59]

Elem [53],value[58]

Elem [54],value[57]

Elem [55],value[56]

Elem [56],value[55]

Elem [57],value[54]

Elem [58],value[53]

Elem [59],value[52]

Elem [60],value[51]

Elem [61],value[50]

Elem [62],value[49]

Elem [63],value[48]

Elem [64],value[47]

Elem [65],value[46]

Elem [66],value[45]

Elem [67],value[44]

Elem [68],value[43]

Elem [69],value[42]

Elem [70],value[41]

Elem [71],value[40]

Elem [72],value[39]

Elem [73],value[38]

Elem [74],value[37]

Elem [75],value[36]

Elem [76],value[35]

Elem [77],value[34]

Elem [78],value[33]

Elem [79],value[32]

Elem [80],value[31]

Elem [81],value[30]

Elem [82],value[29]

Elem [83],value[28]

Elem [84],value[27]

Elem [85],value[26]

Elem [86],value[25]

Elem [87],value[24]

Elem [88],value[23]

Elem [89],value[22]

Elem [90],value[21]

Elem [91],value[20]

Elem [92],value[19]

Elem [93],value[18]

Elem [94],value[17]

Elem [95],value[16]

Elem [96],value[15]

Elem [97],value[14]

Elem [98],value[13]

Elem [99],value[12]

Elem [100],value[11]

Elem [101],value[10]

Elem [102],value[9]

Elem [103],value[8]

Elem [104],value[7]

Elem [105],value[6]

Elem [106],value[5]

Elem [107],value[4]

Elem [108],value[3]

Elem [109],value[2]

Elem [110],value[1]

Printf sqlist info end

------------InsertList_Sq end------------

------------ListDelete_Sq start------------

Delete elem[1],value[110]

Delete elem[2],value[108]

Delete elem[3],value[106]

Delete elem[4],value[104]

Delete elem[5],value[102]

Delete elem[6],value[100]

Delete elem[7],value[98]

Delete elem[8],value[96]

Delete elem[9],value[94]

Delete elem[10],value[92]

Delete elem[11],value[90]

Delete elem[12],value[88]

Delete elem[13],value[86]

Delete elem[14],value[84]

Delete elem[15],value[82]

Delete elem[16],value[80]

Delete elem[17],value[78]

Delete elem[18],value[76]

Delete elem[19],value[74]

Delete elem[20],value[72]

Delete elem[21],value[70]

Delete elem[22],value[68]

Delete elem[23],value[66]

Delete elem[24],value[64]

Delete elem[25],value[62]

Delete elem[26],value[60]

Delete elem[27],value[58]

Delete elem[28],value[56]

Delete elem[29],value[54]

Delete elem[30],value[52]

Delete elem[31],value[50]

Delete elem[32],value[48]

Delete elem[33],value[46]

Delete elem[34],value[44]

Delete elem[35],value[42]

Delete elem[36],value[40]

Delete elem[37],value[38]

Delete elem[38],value[36]

Delete elem[39],value[34]

Delete elem[40],value[32]

Delete elem[41],value[30]

Delete elem[42],value[28]

Delete elem[43],value[26]

Delete elem[44],value[24]

Delete elem[45],value[22]

Delete elem[46],value[20]

Delete elem[47],value[18]

Delete elem[48],value[16]

Delete elem[49],value[14]

Delete elem[50],value[12]

Delete elem[51],value[10]

Delete elem[52],value[8]

Delete elem[53],value[6]

Delete elem[54],value[4]

Delete elem[55],value[2]

Printf sqlist info start

SqList info:BaseAddr[18399248],Length[55],MallocSize[110]

Elem [1],value[109]

Elem [2],value[107]

Elem [3],value[105]

Elem [4],value[103]

Elem [5],value[101]

Elem [6],value[99]

Elem [7],value[97]

Elem [8],value[95]

Elem [9],value[93]

Elem [10],value[91]

Elem [11],value[89]

Elem [12],value[87]

Elem [13],value[85]

Elem [14],value[83]

Elem [15],value[81]

Elem [16],value[79]

Elem [17],value[77]

Elem [18],value[75]

Elem [19],value[73]

Elem [20],value[71]

Elem [21],value[69]

Elem [22],value[67]

Elem [23],value[65]

Elem [24],value[63]

Elem [25],value[61]

Elem [26],value[59]

Elem [27],value[57]

Elem [28],value[55]

Elem [29],value[53]

Elem [30],value[51]

Elem [31],value[49]

Elem [32],value[47]

Elem [33],value[45]

Elem [34],value[43]

Elem [35],value[41]

Elem [36],value[39]

Elem [37],value[37]

Elem [38],value[35]

Elem [39],value[33]

Elem [40],value[31]

Elem [41],value[29]

Elem [42],value[27]

Elem [43],value[25]

Elem [44],value[23]

Elem [45],value[21]

Elem [46],value[19]

Elem [47],value[17]

Elem [48],value[15]

Elem [49],value[13]

Elem [50],value[11]

Elem [51],value[9]

Elem [52],value[7]

Elem [53],value[5]

Elem [54],value[3]

Elem [55],value[1]

Printf sqlist info end

------------ListDelete_Sq end------------

------------GetElem_Sq start------------

The location[27] elem is [57]

------------GetElem_Sq end------------

------------LocateElem_Sq start------------

The elem[57] location is [27]

------------LocateElem_Sq end------------

------------PriorElem start------------

The elem[57] preElem is [59]

------------PriorElem end------------

------------NextElem start------------

The elem[57] nextElem is [55]

------------NextElem end------------

------------ListTraverse start------------

Fun visit:the elem value is [109]

Fun visit:the elem value is [107]

Fun visit:the elem value is [105]

Fun visit:the elem value is [103]

Fun visit:the elem value is [101]

Fun visit:the elem value is [99]

Fun visit:the elem value is [97]

Fun visit:the elem value is [95]

Fun visit:the elem value is [93]

Fun visit:the elem value is [91]

Fun visit:the elem value is [89]

Fun visit:the elem value is [87]

Fun visit:the elem value is [85]

Fun visit:the elem value is [83]

Fun visit:the elem value is [81]

Fun visit:the elem value is [79]

Fun visit:the elem value is [77]

Fun visit:the elem value is [75]

Fun visit:the elem value is [73]

Fun visit:the elem value is [71]

Fun visit:the elem value is [69]

Fun visit:the elem value is [67]

Fun visit:the elem value is [65]

Fun visit:the elem value is [63]

Fun visit:the elem value is [61]

Fun visit:the elem value is [59]

Fun visit:the elem value is [57]

Fun visit:the elem value is [55]

Fun visit:the elem value is [53]

Fun visit:the elem value is [51]

Fun visit:the elem value is [49]

Fun visit:the elem value is [47]

Fun visit:the elem value is [45]

Fun visit:the elem value is [43]

Fun visit:the elem value is [41]

Fun visit:the elem value is [39]

Fun visit:the elem value is [37]

Fun visit:the elem value is [35]

Fun visit:the elem value is [33]

Fun visit:the elem value is [31]

Fun visit:the elem value is [29]

Fun visit:the elem value is [27]

Fun visit:the elem value is [25]

Fun visit:the elem value is [23]

Fun visit:the elem value is [21]

Fun visit:the elem value is [19]

Fun visit:the elem value is [17]

Fun visit:the elem value is [15]

Fun visit:the elem value is [13]

Fun visit:the elem value is [11]

Fun visit:the elem value is [9]

Fun visit:the elem value is [7]

Fun visit:the elem value is [5]

Fun visit:the elem value is [3]

Fun visit:the elem value is [1]

------------ListTraverse end------------

------------ClearList_Sq start------------

------------ClearList_Sq end------------

------------ListEmpty_Sq start------------

The list is empty

------------ListEmpty_Sq end------------

------------DestoryList_Sq start------------

------------DestoryList_Sq end------------

------------The main function end------------

8、疑问

如何判断线性表是否存在?

函数形参中是否应该加const修饰?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值