博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构-线性表的顺序结构
阅读量:4639 次
发布时间:2019-06-09

本文共 4964 字,大约阅读时间需要 16 分钟。

1 #include "stdio.h"  2 #include "stdlib.h"  3   4 typedef int ElemType;        //线性表存储基本类型  5 typedef int Status;            //基本操作函数类型  6 #define LIST_INT_SIZE 50    //线性表初始化存储空间分配量  7 #define LISTINCREMENT 10    //线性表存储空间分配量增值  8 #define OK 1  9 #define ERROR 0 10  11 typedef struct  12 { 13     ElemType *elem;    //存储空间基址 14     int length;        //当前长度 15     int listsize;    //当前分配的存储容量(以sizeof(ElemType)为单位) 16 }SqList; 17  18 //构建一个空的线性表 19 Status InitList(SqList &L) 20 { 21     L.elem = (ElemType *)malloc(LIST_INT_SIZE * sizeof(ElemType)); 22     if(!L.elem)                        //如果初始化失败返回ERROR 23         return ERROR; 24     L.length = 0;                    //空表长度为0 25     L.listsize = LIST_INT_SIZE;        //初始存储容量 26     return OK;     27 }//InitLise 28  29 //销毁线性表L 30 Status DestroyList(SqList &L) 31 { 32     free(L.elem);    //收回空间 33     L.elem = NULL;    //基址指向NULL 34     L.length = 0;    //长度变0 35     L.listsize = 0;    //清除存储容量 36     return OK; 37 }//DestroyList 38  39 //重置线性表L为空表 40 bool ClearList(SqList &L) 41 { 42     L.length = 0; 43     return OK; 44 }//ClearList 45  46 //查看线性表是否为空表 47 Status ListEmpty(SqList L) 48 { 49     if(L.length == 0) 50         return OK; 51     else 52         return ERROR; 53 }//ListEmpty 54  55 //查看线性表的元素个数 56 int ListLength(SqList L) 57 { 58     return L.length;    //返回长度 59 }//ListLength 60  61 //用e返回第i个数据元素的值 62 Status GetElem(SqList L, int i, ElemType &e) 63 { 64     if(i < 1 || i > L.length)    //判断i值是否合法 65         return ERROR; 66     e = L.elem[i-1];                //赋值第i个元素值 67     return OK; 68 }//GetElem 69  70 //返回L中第一个与e满足关系compare()的数据元素 71 //若这样的数据元素不存在则返回0 72 int LocateElem(SqList L, ElemType e, Status(*compare)(ElemType,ElemType)) 73 { 74     ElemType *p = L.elem; 75     int i = 1; 76     while(i <= L.length && !compare(*p++,e)) 77         ++i; 78     if(i <= L.length) 79         return i; 80     else 81         return -1; 82 }//LocateElem 83  84 //若cur_e是L的数据元素,且不是第一个,则用pre_e返回他的前驱 85 //否则操作是啊比,pre_e无定义 86 Status PriorElem(SqList L, ElemType cur_e, ElemType &pre_e) 87 { 88     int i = 2; 89     ElemType *p = L.elem+1; 90     while(i <= L.length && *p != cur_e) 91     { 92         p++; 93         i++; 94     } 95     if(i > L.length) 96         return ERROR; 97     else 98     { 99         pre_e = *--p;100         return OK;101     }102 }//PriorElem103 104 //若cur_e是L的数据元素,且不是最后一个,则用next_e返回他的后驱105 //否则操作是啊比,next_e无定义106 Status NextList(SqList L, ElemType cur_e, ElemType &next_e)107 {108     int i = 1;109     ElemType *p = L.elem;110     while(i <= L.length && *p != cur_e)111     {112         ++p;113         ++i;114     }115     if(i == L.length)116         return ERROR;117     else118     {119         next_e = *++p;120         return OK;121     }122 }//NextList123 124 //插入元素125 Status ListInsert(SqList &L, int i, ElemType e)126 {127     if(i < 1 || i > L.length+1)    //判断i值是否合法128         return ERROR;    129     SqList newbase;        //用于存储新加元素的位置空间130     if(L.length >= L.listsize)    //当前存储分配已满,增加分配131     {132         newbase.elem = (ElemType *)realloc(L.elem,133             (L.listsize + LISTINCREMENT) * sizeof(ElemType));134         if(!newbase.elem)    //存储分配失败135             return ERROR;        136         L.elem = newbase.elem;        //新基址137         L.listsize += LISTINCREMENT;    //增加存储容量138     }139     ElemType *q = &(L.elem[i-1]);    //q指向插入位置140     for (ElemType *p = &(L.elem[L.length-1]); p >= q; --p)    //p指向表尾141         *(p+1) = *p;    //插入位置及之后的元素右移142     *q = e;    //插入元素143     ++L.length;    //表长加一144     return OK;145 }//ListInsert146 147 //删除第几个元素并返回值148 Status ListDelete(SqList &L, int i, ElemType &e)149 {150     if((i < 1) || (i > L.length))            //判断i值是否合法151         return ERROR;                        //i值不合法返回失败152     ElemType *p = &(L.elem[i-1]);            //p指向被删除元素的位置153     e = *p;                                    //返回被删除元素的值154     ElemType *q = L.elem + L.length - 1;    //q指向最后一个元素的位置155     for (++p; p <= q; ++p)                    //被删除元素之后的元素左移156         *(p-1) = *p;157     --L.length;                                //当前表长减一158     return OK;159 }//ListDelete160 161 //依次对L的每一个数据元素调用Visit()函数162 Status ListTraverse(SqList L, void(*Visit)(ElemType*))163 {164     ElemType *p = L.elem;165     int i;166     for(i = 1; i <= L.length; i++)167         Visit(p++);168     printf("\n");169     return OK;170 }//ListTraverse171 172 //ListTraverse()调用函数Visit()173 //Visit函数在这里做输出链表功能174 void Visit(ElemType *c)175 {176     printf("%d",*c);    //%d随data类型而变177 }178 179 //查找元素180 int ListLocate(SqList L, ElemType e)181 {182     int i = 1;183     while(i <= L.length)184     {185         if (L.elem[i-1] == e)186             break;187         i++;188     }189     if(i <= L.length)            //找到指定元素则返回位置否则返回-1190         return i;191     else192         return -1;193 }//ListLocate

线性表的顺序表达的13个基本函数。

参考《数据结构(C语言版)》严蔚敏编著

转载于:https://www.cnblogs.com/ABook/p/5370008.html

你可能感兴趣的文章
hdu 3996
查看>>
python第三十九课——面向对象(二)之初始化属性
查看>>
python学习笔记之函数装饰器
查看>>
FEM计算2D瞬态热传导方程
查看>>
四年时光,匆匆而过
查看>>
【php】【psr】psr1 基础编码规范
查看>>
WAF SSI
查看>>
LDAP & it's implementation
查看>>
Apache HttpComponents中的cookie匹配策略
查看>>
冰封的海盗攻略
查看>>
python from entry to abandon
查看>>
Netty4.x中文教程系列(四) 对象传输
查看>>
linux下find命令使用举例、
查看>>
GET请求在Tomcat中的传递及URI传递
查看>>
ubuntun 服务器与Mac
查看>>
重温JSP学习笔记--与日期数字格式化有关的jstl标签库
查看>>
java-Date-DateFormat-Calendar
查看>>
封装CLLocationManager定位获取经纬度
查看>>
我的第一篇博客-(Eclipse中或Myeclipse中如果不小心删除了包那可怎么办?)
查看>>
对easyui datagrid组件的一个小改进
查看>>