fatal.h

#include <stdio.h>
#include <stdlib.h> #define Error(Str) FatalError(Str)
#define FatalError(Str) fprintf(stderr, "%s\n", Str), exit(1)

array.h

typedef int ElementType;

#ifndef _List_H
#define _List_H struct ListRecord;
typedef struct ListRecord *List;
typedef int Position; List MakeEmpty(List L);
int IsEmpty(List L);
int IsFull(List L);
int IsLast(Position P, List L);
Position Find(ElementType X, List L);
void Delete(ElementType X, List L);
void Insert(ElementType X, List L, Position P);
void DeleteList(List L);
Position Header(List L);
Position First(List L);
Position Advance(Position P);
ElementType Retrieve(Position P, List L); #endif

array.c

#include "array.h"
#include <stdlib.h>
#include "fatal.h" #define CAPACITY 100 struct ListRecord
{
ElementType *Array;
int Last;
}; List MakeEmpty(List L)
{
if (L != NULL)
DeleteList(L);
L = malloc(sizeof(struct ListRecord));
if (L == NULL)
FatalError("Out of memory!");
L->Array = malloc(sizeof(ElementType) * CAPACITY);
if (L->Array == NULL)
FatalError("Out of space!!!");
L->Last = -1;
return L;
} int IsEmpty(List L)
{
return L->Last == -1;
} int IsFull(List L)
{
return L->Last == CAPACITY-1;
} int IsLast(Position P, List L)
{
return P == L->Last;
} Position Find(ElementType X, List L)
{
Position P; P = 0;
while (P <= L->Last && L->Array[P] != X)
P++;
if (P > L->Last)
return -1;
else
return P;
} void Delete(ElementType X, List L)
{
Position P; P = Find(X, L); Position i;
if (P < 0 || P > L->Last)
Error("Illegal position");
for (i = P; i < L->Last; i++)
L->Array[i] = L->Array[i+1];
L->Last--;
} /* Insert (after legal position P) */
void Insert(ElementType X, List L, Position P)
{
Position i, Q; if (IsFull(L))
Error("Full list");
Q = P+1;
if (Q < 0 || Q > L->Last+1)
Error("Illegal position");
for (i = L->Last; i >= Q; i--)
L->Array[i+1] = L->Array[i];
L->Array[Q] = X;
L->Last++;
} void DeleteList(List L)
{
if (L != NULL)
{
free(L->Array);
free(L);
}
} Position Header(List L)
{
return -1;
} Position First(List L)
{
return 0;
} Position Advance(Position P)
{
return ++P;
} ElementType Retrieve(Position P, List L)
{
return L->Array[P];
}

testarray.c

#include <stdio.h>
#include "array.h" void PrintList(const List L)
{
Position P = Header(L); if (IsEmpty(L))
printf("Empty list\n");
else
{
do
{
P = Advance(P);
printf("%d ", Retrieve(P, L));
} while (!IsLast(P, L));
printf("\n");
}
} int main()
{
List L;
Position P;
int i; L = MakeEmpty(NULL);
P = Header(L);
PrintList(L); for (i = 0; i < 10; i++)
{
Insert(i, L, P);
PrintList(L);
P = Advance(P);
}
for (i = 0; i < 10; i += 2)
Delete(i, L); for (i = 0; i < 10; i++)
if (Find(i, L) == -1)
printf("Element %d Find fails\n", i); printf("Finished deletions\n"); PrintList(L); DeleteList(L); return 0;
}

1.线性表-Array的更多相关文章

  1. 数据结构 --- 线性表学习(php模拟)

    线性表:零个或多个数据元素的有限序列(注:以下都是用的整型数据模拟) 一 顺序存储结构(用一段地址连续的存储单元一次存储线性表的数据元素) 1.1 三个属性:存储空间的起始位置:最大存储容量:当前长度 ...

  2. JAVASE02-Unit04: 集合框架 、 集合操作 —— 线性表

    Unit04: 集合框架 . 集合操作 -- 线性表 操作集合元素相关方法 package day04; import java.util.ArrayList; import java.util.Co ...

  3. 线性表之顺序存储结构(C语言动态数组实现)

    线性表的定义:N个数据元素的有限序列 线性表从存储结构上分为:顺序存储结构(数组)和 链式存储结构(链表) 顺序存储结构:是用一段连续的内存空间存储表中的数据 L=(a1,a2,a3....an) 链 ...

  4. 第三章 线性表(C#实现)

    1.线性表 概念::零个或多个数据元素的有序序列. 描述: 2.线性表的抽象数据类型: ADT线性表 Data:线性表的数据对象集合为{a1,a2,...,an},每个元素的类型均为DataType. ...

  5. [置顶] ※数据结构※→☆线性表结构(queue)☆============队列 顺序存储结构(queue sequence)(八)

    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作的 ...

  6. [置顶] ※数据结构※→☆线性表结构(queue)☆============循环队列 顺序存储结构(queue circular sequence)(十)

    循环队列 为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量.存储在其中的队列称为循环队列(Circular Queue). ...

  7. java实现线性表

    /** * 线性表 * @author zyyt * */ public  class LinkList {//框架级别的大师级 private int size;//链表的实际大小 private ...

  8. 顺序线性表之大整数求和C++

    顺序线性表之大整数求和 大整数求和伪代码 1.初始化进位标志 flag=0: 2.求大整数 A 和 B 的长度: int aLength = a.GetLength(); int bLength = ...

  9. 顺序线性表 ---- ArrayList 源码解析及实现原理分析

    原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7738888.html ------------------------------------ ...

随机推荐

  1. h5页面 禁止缩放

    <head><meta name="viewport" content="width=device-width,minimum-scale=1.0,ma ...

  2. 各大浏览器hack

    浏览器界的奇葩IE 样式前缀法,在需要制定某些浏览器只识别其中某些属性的时候: chrome/safari 都是webkit内核的浏览器.在属性前加前缀-webkti- firefox 只在火狐浏览器 ...

  3. python基础五

    列表生成式 将列表data=[1,2,3]里的元素都乘2 方法一 data=[1,2,3] for index,i in enumerate(data): data[index] *=2 print( ...

  4. OSSFS将OSS bucket 挂载到本地文件系统及注意事项

    OSSFS将OSS bucket 挂载到本地文件系统及注意事项 下载ossfs安装包 wget http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/as ...

  5. Xcode 此证书签发者无效

    1.https://developer.apple.com/certificationauthority/AppleWWDRCA.cer 安装此证书 2.在keychains里选择login,然后点选 ...

  6. NEFU 561 方块计算

    题目链接 简单搜索题 #include <cstdio> #include <iostream> #include <cstring> using namespac ...

  7. 数据库Blob数据类型转String

    blob数据是存储大对象数据类型, 一般存放二进制的,所以才用字节存取. 首先判断blob数据是否为空,然后采用输入流读出数据,具体代码如下: String content = null; try { ...

  8. NavigationController

    前面的一篇文章<iOS开发16:使用Navigation Controller切换视图>中的小例子在运行时,屏幕上方出现的工具栏就是Navigation Bar,而所谓UINavigati ...

  9. Swift 提示:Initialization of variable was never used consider replacing with assignment to _ or removing it

    Swift 提示:Initialization of variable was never used consider replacing with assignment to _ or removi ...

  10. Ubuntu防火墙设置

    转载自:http://baisongfly.blog.163.com/blog/static/30135117200923005956159/ 1.安装 sudo apt-get install uf ...