数据结构C语言版:线性表之顺序表
线性表是一个线性结构。线性表采用顺序存储的方式
存储就称为顺序表。那么定义一种数据结构就是要描术出数据的逻辑结构、存储结构和运算集合。存储结构是一个结构体,运算集合包括:初始化、
插、删、改、打印、搜索等。顺序表的类型描述如下: ADT sequence\_list{ 数据集合 K: K={k(1), k(2), ...,k(n)}, n >=0, K中的地素是datatype类型; 数据关系 R: R={r} r={ | i=1, 2, ..., n-1} 操作集合: (1) void init(sequence\_list *slt);顺序表的初始化---置空表 (2) void append(sequence\_list *slt, datatype x); 在顺序表后部插入值为x的结点 (3) void display(sequence\_list slt);打印顺序表的各结点值 (4) int empty(sequence\_list slt);判断顺序表是否为空 (5) int find(sequence\_list slt, datatype x);查找顺序表中值为x的结点位置 (6) datatype get(sequence\_list slt, int i);取得顺序表中第i个结点的值 (7) void insert(sequence\_list *slt, datatype x, int position);在顺序表的postion位置插入值为x的结点 (8) void dele(sequence\_list *slt, int position);删除表中第position位置的结点 }ADT sequence\_list; 下面用C代码实现:
csequlist.h文件定了数据结构,声明了基于数据结构的操作集:
#define MAXSIZE 100 typedef int datatype; typedef struct { datatype a[MAXSIZE]; int size; }sequence_list; void init(sequence_list *slt); void append(sequence_list *slt, datatype x); void display(sequence_list slt); int empty(sequence_list slt); int find(sequence_list slt, datatype x); datatype get(sequence_list slt, int i); void insert(sequence_list *slt, datatype x, int position); void dele(sequence_list *slt, int position);
csequlist.cpp定义了数据结构的操作集:
#include "stdafx.h" #include < iostream > #include "csequlist.h" void init(sequence_list *slt) { slt->size = 0; } void append(sequence_list *slt, datatype x) { if(slt->size == MAXSIZE) { printf("顺序表当前已满");exit(1); } slt->a[slt->size] = x; ++slt->size; } void display(sequence_list slt) { if(!slt.size) printf("\n顺序表是空的"); else for(int i = 0; i < slt.size; ++i) printf("%5d", slt.a[i]); } int empty(sequence_list slt) { return (slt.size == 0 ? 1 : 0); } int find(sequence_list slt, datatype x) { int i = 0; while(i < slt.size && slt.a[i] != x) ++i; return (i < slt.size ? i : -1); } datatype get(sequence_list slt, int i) { if(i < 0 || i >= slt.size) { printf("\n指定的位置的结点不存在");exit(1); } else return slt.a[i]; } void insert(sequence_list *slt, datatype x, int position) { int i; if(slt->size == MAXSIZE) { printf("\n顺序表当前已满");exit(1); } if(position < 0 || position > slt->size) { printf("\n指 定的插入位置不存在");exit(1); } for(i = slt->size;i > position; --i) slt->a[i] = slt->a[i-1]; slt->a[position] = x; ++slt->size; } void dele(sequence_list *slt, int position) { int i; if(slt->size == 0) { printf("\n顺序表是空的!");exit(1); } if(position < 0 || position > slt->size) { printf("\n指 定的删除位置不存在");exit(1); } for(i = position; i < slt->size-1; ++i) { slt->a[i] = slt->a[i+1]; } --slt->size; }
main.cpp
sequence_list s; init(&s); append(&s, 100); append(&s, 200); insert(&s, 150, 1); display(s); std::cout << "\nPress Enter or Return to exit!"; std::cin.get(); return 0;