顺序表的C、C++实现
一个线性表表实现,函数声明放在 line_list.h 头文件汇总,函数定义放在line_list.c 中,main.c 用来测试各个函数.
1.文件 line_list.h
// line_list.h
#ifndef __LINE_LIST_H__
#define __LINE_LIST_H__
typedef int EleType;
typedef struct {
EleType* pData; //定义成指针,可以存放任意类型
unsigned int num;
unsigned int maxlength; //线性表最大长度
}List;
List* CreateList(const int ); //创建线性表
void DestoryList(List*); //删除线性表
void ClearList(List*); //清空线性表
int ListAppend(List*, EleType); // 追加元素
int IsEmpty(List *); //判空
int IsFull(List *); //判满
int ListDelete(List *,unsigned int); //删除元素
int GetElement(List *,unsigned int,EleType *); // 取元素
int ListInsert(List *,unsigned int ,EleType ); //插入元素
int TraverseList(List *,int (*)(EleType * )); //遍历线性表
#endif
- 文件 line_list.c
// line_list.c
#include <stdio.h>
#include <stdlib.h>
#include "line_list.h"
//创建线性表, maxlength为线性表最大长度
List* CreateList(const int maxlength)
{
List* ls = (List*)malloc(sizeof(List));
if(NULL != ls)
{
ls->pData = (EleType*)malloc((maxlength )*sizeof(EleType));
if(NULL != ls->pData)
{
ls->maxlength = maxlength;
ls->num = 0;
return ls;
}
}
printf("out of place.\n");
return NULL;
}
//删除线性表
void DestoryList(List* ls)
{
free(ls->pData);
free(ls);
}
//清空线性表
void ClearList(List* ls)
{
ls->num = 0;
}
//判空,,线性表为空返回 1 ,否则返回 0
int IsEmpty(List* ls)
{
return (0 == ls->num);
}
//判满,线性表已满返回 1 ,否则返回 0
int IsFull(List* ls)
{
return (ls->num == ls->maxlength);
}
// 在末尾追加元素,成功返回1,失败返回0
int ListAppend(List* ls, EleType ele)
{
if(!IsFull(ls))
{
ls->pData[ls->num++] = ele; //注意这里
return 1;
}
return 0;
}
//删除元素,删除编号为 n 的元素,编号为 n 的元素,索引为 n-1,成功返回1,失败返回0
int ListDelete(List* ls, unsigned int n)
{
if (!IsEmpty(ls))
{
if (n<1 || n>ls->num)
{
printf("n输入错误");
return 0;
}
for( ;n<ls->num;n++ )
{
ls->pData[n-1] = ls->pData[n];
}
ls->num--;
return 1;
}
return 0;
}
// 取元素编号为 n 的元素,索引为 n-1,成功返回1,失败返回0
int GetElement(List* ls,unsigned int n, EleType * ele)
{
if(!IsEmpty(ls))
{
if(n<1 || n>ls->maxlength)
{
printf("n输入错误");
return 0;
}
*ele = ls->pData[n-1];
return 1;
}
return 0;
}
//插入元素,在位置 n 插入元素,编号为 n 的元素,索引为 n-1,成功返回1,失败返回0
int ListInsert(List* ls,unsigned int n, EleType ele)
{
unsigned int i=0;
if(!IsFull(ls))
{
if(n<1 || n>ls->num)
{
printf("n输入错误");
return 0;
}
for(i=ls->num; i>=n;i--)
{
ls->pData[i] = ls->pData[i-1];
}
ls->pData[n-1] = ele;
ls->num++;
return 1;
}
return 0;
}
//遍历线性表,遍历线性表,并对元素进行操作,遍历完成返回 -1,否则返回当前元素编号。
int TraverseList(List* ls, int (*f)(EleType* ))
{
unsigned int i=0;
if (!IsEmpty(ls))
{
for (i=0;i<ls->num;i++)
{
if(!f(&ls->pData[i]))
return i+1;
}
return 0;
}
return -1;
}
- 文件 main.c
// main.c
#include <stdio.h>
#include "line_list.h"
void ShowList(List*); //显示线性表
int PrintElement(EleType* ); //输出元素
int main()
{
int i;
EleType ele;
//创建线性表
List* ls = CreateList(100);
if (NULL == ls)
{
printf("创建线性表失败\n");
return 0;
}
//测试判空函数
i =IsEmpty(ls);
if(i)
{
printf("线性表为空\n");
}
for (i=0;i<100;i++)
{
ListAppend(ls,i+1);
}
ShowList(ls);
//测试判满函数
i =IsFull(ls);
if(i)
{
printf("线性表已满\n");
}
//测试取元素
GetElement(ls,3,&ele);
printf(" ele = %d\n",ele);
//测试插入
ListInsert(ls,5,23);
ShowList(ls);
ListInsert(ls,1,23);
ShowList(ls);
//测试删除
ListDelete(ls,1);
ShowList(ls);
ListDelete(ls,5);
ShowList(ls);
return 1;
}
//显示线性表
void ShowList(List* ls)
{
TraverseList(ls,PrintElement);
printf("\n");
}
//输出元素
int PrintElement(EleType* ele)
{
printf("%d ",*ele);
return 1;
}
顺序表的C、C++实现的更多相关文章
- jdk顺序表笔记
一.AbstractCollection 提供了集合的最大实现 继承该类,必须实现size()和iterator(),因为该类操作集合都是通过iterator 二.fail-fast策略 该策略在集合 ...
- c++顺序表基本功能
头文件 #define LIST_MAX_SIZE 5#define LISTINCREMENT 2#include<assert.h>#include<string>temp ...
- 数据结构:顺序表(python版)
顺序表python版的实现(部分功能未实现) #!/usr/bin/env python # -*- coding:utf-8 -*- class SeqList(object): def __ini ...
- 《数据结构》2.2顺序表(sequence list)
//顺序表节点的定义 typedef struct { datatype data[MAXSIZE]; //数组容量的上限 int len; //记录最后一个元素的位置,相当于一个指针,表空时len= ...
- c数据结构 顺序表和链表 相关操作
编译器:vs2013 内容: #include "stdafx.h"#include<stdio.h>#include<malloc.h>#include& ...
- java顺序表和树的实现
一.顺序表 1.线性表 //java顺序表的实现,如ArrayList就是用线性表实现的,优点是查找快,缺点是添加或删除要移动很多元素,速度慢 public class SequenceList { ...
- 数据结构顺序表删除所有特定元素x
顺序表类定义: template<class T> class SeqList : { public: SeqList(int mSize); ~SeqList() { delete[] ...
- 顺序表C语言版
#include <stdio.h> /* * 顺序表最多输入N个数 */ #define N 10 #define OK 1 #define ERROR -1 struct sequeu ...
- C#线性表之顺序表
线性表是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这种一对一的关系指的是数据元素之间的位置关系,即: ...
- C语言 线性表 顺序表结构 实现
一个能够自动扩容的顺序表 ArrList (GCC编译). #include <stdio.h> #include <stdlib.h> #include <string ...
随机推荐
- Python2.7-math, cmath
math,cmath 模块,提供了用C标准定义的数学函数,简单说就是效率较高,cmath 不仅有 math 的功能,还增加了计算复数的函数.这两个模块返回的值基本上为 float 类型,除非明确指出返 ...
- 贪心算法——字典序最小问题,Saruman‘s Army
题目描述 Best Cow Line (POJ 3617) 给定长度为N的字符串S,要构造一个长度为N字符串T.T是一个空串,反复执行下列任意操作: 从S的头部删除一个字符,加到T的尾部: 从S的尾部 ...
- 虚拟机和主机ping不通解决的方法
虚拟机和主机ping不通 一般有3种方式:NAT.bridged .host-Only. Bridged方式: 在图1中Network connection中选中第1项,即在vm ware虚拟机属性里 ...
- R语言的数据输入
既然了解了R语言的基本数据类型,那么如何将庞大的数据送入R语言进行处理呢?送入的数据又是如何在R语言中进行存储的呢?处理这些数据的方法又有那些呢?下面我们一起来探讨一下. 首先,数据输入最直接最直观的 ...
- 20155223 Exp3 免杀原理与实践 实验报告
20155223 Exp3 免杀原理与实践 实验报告 实验前准备 安装Veil-Evasion 直接使用Kali快速安装命令,拒绝采用git安装命令 apt-get -y install veil-e ...
- Luogu P1484 种树
这道题目还是比较简单的 首先题目的意思就让我们很轻易地想到DP 我们设f[i][j]表示前i个坑中种j棵树的最大利益,则有: f[i][j]=max(f[i-1][j],f[i-2][j-1]+a[i ...
- 汇编 MOV -2
知识点: MOV指令 基址 内联汇编 把OD附加到资源管理器右键菜单 一.MOV指令 aaa=0x889977;//MOV DWORD PTR DS:[0x403018],0x8899 ...
- python 回溯法 子集树模板 系列 —— 2、迷宫问题
问题 给定一个迷宫,入口已知.问是否有路径从入口到出口,若有则输出一条这样的路径.注意移动可以从上.下.左.右.上左.上右.下左.下右八个方向进行.迷宫输入0表示可走,输入1表示墙.为方便起见,用1将 ...
- [C/C++标准库]_[初级]_[转换UTC时间到local本地时间]
场景 1.如果有面向全球用户的网站, 一般在存储时间数据时存储的是UTC格式的时间, 这样时间是统一的, 并可以根据当地时区来进行准确的转换. 2.存储本地时间的问题就在于如果换了时区, 那么显示的时 ...
- CF 55 D. Beautiful numbers
D. Beautiful numbers 链接 题意: 求[L,R]中多少个数字可以整除它们的每一位上的数字. 分析: 要求模一些数字等于0等价于模它们的lcm等于0,所以可以记录当前出现的数字的lc ...