线性表之顺序存储实现
2015-12-23 02:27
281 查看
#ifndef _SQ_LIST_H_ #define _SQ_LIST_H_ #pragma once /************************************************************************/ /* 线性表List */ /************************************************************************/ /*ADT 线性表(List) Data 线性表的数据对象集合为{a1,a2,....an},每个元素的类型为DataType。其中除了第一个元素a1外, 其他数据元素都有且仅有一个后继元素,除了最后一个元素an外,其他数据元素都有且仅有一个前驱元素。 数据元素之间的关系时一种一对一的关系。 Operation InitList(*L);初始化操作,建立一个空的线性表L。 ListEmpty(L);若线性表为空,返回true,否则返回false ClearList(*L);将线性表清空 GetElem(L,i,*e);将线性表中第i个位置元素值返回给e LocateElem(L,e);在线性表中查找与给定值e相等的元素,如果查找成功,返回该元素在线性表中的序号表示成功;否则返回-1表示失败 ListInsert(*L,i,e);在线性表中的第i个位置插入元素e ListDelete(*L,i,*e);删除线性表中第i个位置的元素,并返回这个位置的元素值e ListLength(L);返回线性表L的元素个数 endADT */ /************************************************************************/ /* 线性表顺序存储实现SequenceList */ /************************************************************************/ #define MaxCapacity 100 typedef int ElemType; typedef struct { ElemType* data; int length; int capacity; }SqList; #define OK 1 #define ERROR 0 typedef int Status; /**初始化操作,建立一个空的线性表L。*/ int InitList(SqList* L) { L->data = (ElemType*)malloc(sizeof(ElemType)*MaxCapacity); if(NULL == L->data) return ERROR; L->capacity = MaxCapacity; L->length = 0 ; return OK; } /**若线性表为空,返回true,否则返回false*/ bool ListEmpty(SqList L) { return L.length == 0; } /**将线性表清空*/ Status ClearList(SqList*L) { free(L->data); L->data = NULL; L->length = 0; return OK; } /**将线性表中第i个位置元素值返回给e*/ Status GetElem(SqList L,int i,ElemType* e) { if( i< 0 ||L.length == 0 || i >= L.length) return ERROR; *e = L.data[i]; return OK; } /**在线性表中查找与给定值e相等的元素,如果查找成功,返回该元素在线性表中的序号表示成功;否则返回-1表示失败*/ int LocateElem(SqList L ,ElemType e) { if(L.length == 0) return -1; for (int i = 0 ; i < L.length; i++) { if(L.data[i] == e) return i; } return -1; } /**在线性表中的第i个位置插入元素e*/ Status ListInsert(SqList*L,int i,ElemType e) { if(L->length == MaxCapacity ||i < 0 ||i > L->length) return ERROR; for (int j = L->length ; j>=i ; j--) { L->data[j+1] = L->data[j]; } L->data[i] = e; L->length++; return OK; } /**删除线性表中第i个位置的元素,并返回这个位置的元素值e*/ Status ListDelete(SqList*L,int i,ElemType* e) { if (L->length == 0 || i < 0 ||i >= L->length) return ERROR; *e = L->data[i]; for (int k = i ; k<L->length ; k++) { L->data[k] = L->data[k+1]; } L->length--; return OK; } /**返回线性表L的元素个数*/ int ListLength(SqList L) { return L.length; } #endif //_SQ_LIST_H_测试程序
#include "stdafx.h"#include "SqList.h"int _tmain(int argc, _TCHAR* argv[]){ SqList sqStruct; SqList* L = &sqStruct; Status result = InitList(L); for (int i = 0 ; i < 10 ; i++) { ListInsert(L,i,i+1); } std::cout<<"线性表存储有"<<ListLength(*L)<<"个元素"<<std::endl; ElemType deleteValue; ListDelete(L,1,&deleteValue); std::cout<<"删除第"<<1<<"个的元素值为:"<<deleteValue<<std::endl; std::cout<<"线性表存储剩余有"<<ListLength(*L)<<"个元素"<<std::endl; ElemType getValue; GetElem(*L,4,&getValue); std::cout<<"获取的第"<<4<<"个的元素值为:"<<getValue<<std::endl; int position = LocateElem(*L,6); std::cout<<"值为"<<6<<"的元素位置为:"<<position<<std::endl; bool isEmpty = ListEmpty(*L); std::string strEmpty = isEmpty ? "为空":"不为空"; std::cout<<"当前线性表"<<strEmpty.c_str()<<std::endl; for(int i = 0 ; i < L->length; i++) { std::cout<<"当前线性表第"<<i<<"项元素的值为"<<L->data[i]<<std::endl; } result = ClearList(L); std::cout<<"执行清空操作"<<std::endl; return 0;}
相关文章推荐
- hdu 3535 AreYouBusy(分组背包)(推荐)
- JavaScript模块化开发1
- Jenkins 简介
- 函数与方法
- windows2008 IIs部署MVC + mvc4 http错误403.14 forbidden
- Java中时间日期格式化
- 安装idea + erlang
- 个人对linux内核中的linux_digent64结构体的理解
- OpenGL渲染流程
- JavaScript闭包
- Linux关闭防火墙、SELinux
- inux设置普通用户无密码sudo权限
- hadoop安装包的目录结构
- mysql配置主从时报错及处理
- Android多点触控之——MotionEvent(触控事件)
- Introduction to Glide, Image Loader Library for Android, recommended by Google
- Hadoop的伪分布式搭建
- Linux关闭防火墙、SELinux
- 关于android EditText去掉下滑线
- 自动化部署PXE+Kickstart VS Cobbler