顺序线性表的存储与实现(C语言版)
2020-02-15 07:18
393 查看
代码实现
#include<stdio.h>//printf(),scanf() #include<stdlib.h>//exit(),malloc() //函数结果状态代码 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 //Status,ElemType均是函数的类型 typedef int Status; typedef int ElemType; //线性表动态分配顺序存储结构 #define LIST_INIT_SIZE 100//线性表存储空间的初始分配量 #define LISTINCREMENT 10//线性表存储空间的分配增量 typedef struct { ElemType *elem;//存储空间基址 int length;//当前长度 int listsize;//当前分配的存储容量(以sizeof(ElemType)为单位) }SqList; //操作结果:构造一个空的线性表L Status InitList_Sq(SqList &L){ L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); if(!L.elem)exit(OVERFLOW);//存储分配失败 L.length=0;//空表长度为0 L.listsize=LIST_INIT_SIZE;//初始存储容量 return OK; } //初始条件:线性表L已存在 //操作结果:摧毁线性表L Status DestroyList_Sq(SqList &L){ if(L.elem!=NULL){ free(L.elem); L.length=0; L.listsize=0; printf("摧毁顺序线性表!\n"); } return 0; } //初始条件:线性表L已存在 //操作结果:将L重置为空表 Status ClearList_Sq(SqList &L){ if(L.elem!=NULL){ L.length=0; printf("置为空表!\n"); } } //初始条件:线性表L已存在 //操作结果:若L为空表,则返回TRUE,否则返回FALSE Status ListEmpty_Sq(SqList L){ if(L.elem!=NULL&&L.length==0){ printf("空表!\n"); return TRUE; } else{ printf("非空表!\n"); return FALSE; } } //初始条件:线性表L已存在 //操作结果:返回L中数据元素个数 int ListLength_Sq(SqList L){ if(L.elem!=NULL) return L.length; else return ERROR; } //初始条件:线性单链表已存在,1<=i<=ListLength(L) //操作结果:用e返回L中第i个数据元素的值 Status GetElem_Sq(SqList L,int i,ElemType &e){ if(ListEmpty_Sq(L)) return ERROR; if(i<1||i>L.length){ printf("不存在第%d个元素!\n",i); return ERROR; } e=L.elem[i-1]; return e; } Status compare(ElemType a,ElemType b){ if(a==b) return TRUE; return FALSE; } //初始条件:线性表L已存在 //操作结果:返回L中第1个与e满足关系compare{}的数据元素的位序,若这样的数据元素不存在,则返回值为0 int LocateElem_Sq(SqList L,ElemType e,Status (*compare)(ElemType,ElemType)){ int i=1;//i的初值为第1个元素的位序 ElemType *p=L.elem; //p的初值为第1个元素的存储位置 while(i<=L.length&&!(*compare)(*p++,e))++i; if(i<=L.length)return i; else return 0; } //初始条件:线性表L已存在 //操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义 int PriorElem_Sq(SqList L,ElemType cur_e,ElemType &pre_e){ int i=2; while(i<=L.length){ if(cur_e==L.elem[i-1]);{ pre_e=L.elem[i-2]; return OK; } i++; } return FALSE; } //初始条件:线性表L已存在 //操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义 int NextElem_Sq(SqList L,ElemType cur_e,ElemType &next_e){ int i=1; while(i<L.length){ if(cur_e==L.elem[i-1]);{ next_e=L.elem[i]; return OK; } i++; } return FALSE; } //初始条件:线性表L已存在,1<=i<=listlength(L)+1 //操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 Status ListInsert_Sq(SqList &L,int i,ElemType e){ if(i<1||i>L.length+1) return ERROR;//i值不合法 if(L.length>=L.listsize){//当前存储空间已满,增加分配 ElemType *newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType)); if(!newbase)exit(OVERFLOW);//存储分配失败 L.elem=newbase;//新基址 L.listsize+=LISTINCREMENT;//增加存储容量 } ElemType *q=&(L.elem[i-1]);//q为插入位置 for(ElemType *p=&(L.elem[L.length-1]);p>=q;--p) *(p+1)=*p;//插入位置及之后的元素右移 *q=e;//插入e ++L.length;//表长增1 return OK; } //初始条件:线性表L已存在,1<=i<=ListLength(L) //操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 Status ListDelete_Sq(SqList &L,int i,ElemType &e){ if(i<1||i>L.length)return ERROR;//i值不合法 ElemType *p=&(L.elem[i-1]);//p为被删除元素的位置 e=*p;//被删除元素的值赋给e ElemType *q=L.elem+L.length-1;//表尾元素的位置 for(++p;p<=q;++p) *(p-1)=*p;//被删除元素之后的元素左移 --L.length; return OK; } Status visit(ElemType e){ printf("%d ",e); return true; } //初始条件:线性表L已存在 //操作结果:依次对L的每个数据元素调用函数visit(),一旦visit()失败,则操作失败 Status ListTraverse_Sq(SqList L,Status (*visit)(ElemType)){ int i=1; ElemType *p=L.elem; while(i<=L.length&&(*visit)(*p++))++i; return OK; } int main(){ SqList L; ElemType e,pre_e,next_e; InitList_Sq(L); ListInsert_Sq(L,1,3); ListInsert_Sq(L,2,7); ListInsert_Sq(L,3,9); ListInsert_Sq(L,4,1); ListInsert_Sq(L,5,44); ListInsert_Sq(L,6,15); ListTraverse_Sq(L,visit); printf("\n"); printf("List length is %d\n",ListLength_Sq(L)); printf("第5个数为: %d\n",GetElem_Sq(L,5,e)); e=15; printf("15所在的位置为: %d\n",LocateElem_Sq(L,15,compare)); PriorElem_Sq(L,e,pre_e); NextElem_Sq(L,e,next_e); printf("e的前驱为: %d, 后继为: %d\n",pre_e,next_e); ListDelete_Sq(L,3,e); printf("所删除的值为: %d\n",e); printf("遍历: "); ListTraverse_Sq(L,visit); printf("\n"); ListEmpty_Sq(L); ClearList_Sq(L); ListEmpty_Sq(L); DestroyList_Sq(L); return 0; }
运行结果
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- C语言总结
- Closest Pair 解题小记:C++运行错误:process returned -1073741571 且 函数计算错误
- C语言之函数的参数传递
- C语言之结构体中“ . ”和“ -> ”的区别
- C语言之双向链表
- C++异常处理机制
- C++调用Pytorch的坑:遇到free(): invalid pointer:
- 《计算方法与实习》 c语言与python分别实现二分法求方程的根
- C语言课程设计
- c语言个人信息管理系统
- c语言贪吃蛇游戏(可运行)控制台界面
- 【C/C++】随机数的生成
- 【C++】string::find函数
- 【C++】string::substr函数
- 【C/C++】关于strstr函数和c_str()函数
- 文件转C语言数组 二进制文件转16进制 BIN转HEX BMP图片转数组 任意文件转数组 软件下载
- Windows下C++使用MinGW编译protocol buffer
- 【C语言】变量
- 【C语言】堆栈区的生长方向
- 探讨C语言字符串的初始化,赋值以及会出现的问题