线性表的实现(C语言)
来源:互联网 发布:下载手机开关机软件 编辑:程序博客网 时间:2024/05/16 11:45
线性表的实现(C语言)
SqList
1.储存结构定义:
#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define INITSIZE 100//线性表储存结构初始分配分量#define ENLARGE 10 //线性表储存结构分配增量typedef int Status;typedef int ElemType;typedef struct{ ElemType *elem; //线性表基址 int length; //线性表长度 int listsize; //当前分配的容量}SqList;
2.构造线性表:
Status InitList(SqList *L){ //构造一个空的线性表 L->elem = (ElemType*)malloc(INITSIZE * sizeof(ElemType)); if(!L->elem) exit(OVERFLOW); L->length = 0; L->listsize = INITSIZE; return OK;}
3.销毁线性表:
Status DestroyList(SqList *L){ //销毁线性表L free(L->elem); L->elem = NULL; L->length = 0; L->listsize = 0; return OK;}
4.重置线性表
Status ClearList(SqList *L){ //将L重置为空表 free(L->elem); L->elem = (ElemType*)malloc(INITSIZE * sizeof(ElemType)); if(!L->elem) exit(OVERFLOW); L->length = 0; L->listsize = INITSIZE; return OK;}
5.判断线性表是否为空表
Status EmptyList(SqList *L){ //判断L是否为空表 if(!L->elem) exit(INFEASIBLE); if(L->length == 0) return TRUE; else return FALSE;}
6.线性表长度
Status ListLength(SqList *L){ //返回线性表L中的元素个数 return L->length;}
7.返回值
Status GetElem(SqList *L,int i){ //用e返回线性表L中的第i个值 ElemType *p = L->elem; if(i >= 1 && i <= L->length){ return *(p + i - 1); } else return ERROR;}
8.判断元素
Status LocateElem(SqList *L,ElemType e){ //判断线性表中是否存在e ElemType *p; p = L->elem; int i = 1; while(i <= L->length && *(p++) != e){ i++; } if(i <= L->length) return i; else return ERROR;}
9.找前驱
Status PriorElem(SqList *L,int i){ //找线性表中第i个元素的前驱 if(i == 1) return ERROR; else{ return L->elem[i - 2]; }}
10.找后继
Status NextElem(SqList *L,int i){ //找线性表中第i个元素的后继 if(i == L->length) return ERROR; else{ return L->elem[i]; }}
11.扩充储存空间
Status MallocAgain(SqList *L){ //扩充线性表的储存空间 ElemType *p; p = (ElemType*)realloc(L->elem,ENLARGE * sizeof(ElemType)); if(!p) exit(OVERFLOW); L->elem = p; L->listsize += ENLARGE; printf("储存空间已扩充!"); return OK;}
12.插入元素
Status ListInsert(SqList *L,int i,ElemType e){ //在线性表第i个位置前插入e int k; ElemType *p; p = L->elem; if(L->length == INITSIZE){ MallocAgain(&L); } if(i < 1 || i > L->length + 1){ printf("插入位置不正确!"); return ERROR; } if(i >= 1 && i <= L->length){ //非表尾插入的情况 if(L->length != 0){ for(k = L->length - 1;k >= i - 1;k--){ *(p + k + 1) = *(p + k); } } } *(p + i - 1) = e; L->length = L->length + 1; return OK;}
13.删除元素
Status ListDelete(SqList *L,int i){ //删除线性表第i个元素 ElemType *p; ElemType e; p = L->elem; if(EmptyList(L)){ printf("线性表为空,无法进行操作!"); return ERROR; } e = *(p + i - 1); for(int j = i - 1;j < L->length;j++){ *(p + j) = *(p + j +1); } L->length--; return e;}
14.遍历线性表
Status ListTraverse(SqList *L){ //遍历输出线性表元素 for(int i = 1;i <= L->length;i++){ printf("%d\n",GetElem(L,i)); } return OK;}
15.主函数
int main(){ SqList *L; ElemType e; int len; ElemType *cur_e; InitList(&L); ListInsert(&L,1,18); ListInsert(&L,1,17); ListInsert(&L,1,16); ListInsert(&L,1,15); ListInsert(&L,1,14); len = ListLength(&L); for(int i = 1;i <= len;i++){ printf("%d\n",GetElem(&L,i)); } printf("线性表长度:%d\n",len); printf("*****************************\n"); printf("删除:%d\n",ListDelete(&L,1)); len = ListLength(&L); for(int i = 1;i <= len;i++){ printf("%d\n",GetElem(&L,i)); } printf("线性表长度:%d\n",len); printf("*****************************\n"); printf("第三个元素的前驱:%d\n",PriorElem(&L,3)); printf("第三个元素的后继:%d\n",NextElem(&L,3)); printf("*****************************\n"); ListTraverse(&L); DestroyList(&L);}
- 运行结果:
阅读全文
0 0
- 线性表的实现(C语言)
- 线性表的顺序实现(C语言)
- 线性表的顺序实现(c语言)
- 线性表的C语言实现
- C语言线性表的实现
- 线性表的C语言实现
- 线性表基本功能的c语言实现
- 线性链表的c语言实现
- C语言中线性表的实现
- 线性表的顺序方式实现(c语言)
- 线性表的链式存储(单链表)C语言实现
- 【数据结构】数据结构C语言的实现(线性表)
- 顺序线性表的基本操作(C语言实现)
- 线性表的顺序存储结构(C语言实现)
- 线性表的链式存储结构(C语言实现)
- 线性表顺序实现(C语言)
- C语言实现线性表
- 线性表 C语言实现
- NOI 2015 荷马史诗 (哈夫曼树)
- neutron-vpnaas添加证书认证总结
- CentOS下nginx+tomcat负载均衡集群的搭建
- 免费的论文查重网站
- laravel excel 导出乱码
- 线性表的实现(C语言)
- 基于shiro的权限管理-基础概念
- Linux基本命令、文件目录管理
- JVM 之 类的装载机制
- Android混淆实现
- [Android]Snackbar的第一个参数
- Shuffle的读写操作(一)
- CSS3设置Div左右两边或者上下边框的样式
- u-boot烧录、使用和编译