数据结构(严蔚敏)C语言实现---线性表的顺序存储
2017-11-28 16:01
986 查看
总觉得写的代码差点什么,所以回过头开始看数据结构,真正去实现一下。
这次看的是线性表的顺序存储,代码如下:
1、为了增加代码可读性,用了一些宏定义,文件名称为BaseDefine.h,内容如下:
3、线性表的实现,名称为SequenceList.c,内容如下:
4、调用这些方法,以验证是否正确,文件名main.c,内容如下:
5、编译
6、执行
7、执行结果
8、疑问
如何判断线性表是否存在?
函数形参中是否应该加const修饰?
这次看的是线性表的顺序存储,代码如下:
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 <stdio.h> #include <malloc.h> #include <stdlib.h> #include <memory.h> 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 <stdio.h> #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("---- 4000 --------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修饰?
相关文章推荐
- 【数据结构之线性表顺序存储】简单的数组的方式实现
- 【数据结构作业一】写出顺序表的结构体类型定义及查找、插入、删除算法,并以顺序表作存储结构,实现线性表的插入、删除
- 数据结构2----线性表顺序存储和链式存储的实现(霜之小刀)
- 数据结构之---C语言实现二叉树的顺序存储
- 数据结构之线性表代码实现顺序存储,链式存储,静态链表(选自大话数据结构)
- 数据结构(严蔚敏)之一——顺序表之c语言实现
- 数据结构复习——线性表的顺序存储实现
- 数据结构之---c语言实现栈的顺序存储
- 数据结构之---C语言实现串的顺序存储
- 数据结构 学习笔记之:顺序栈的C语言实现
- 一、数据结构基础之顺序表C语言实现
- 数据结构之线性表顺序存储
- c语言的线性表的顺序存储的实现,数组
- C语言 数据结构 线性表的顺序表示
- C语言实现线性表连续存储结构相关算法
- 线性表——顺序结构(c语言实现)
- 数据结构实现顺序线性表的一些小应用
- 数据结构之线性表顺序存储的常用操作(转载)
- 线性结构的顺序存储和链式存储的实现代码(二)
- 七、数据结构基础之顺序串C语言实现