顺序表,即线性表用顺序存储结构保存数据,数据是连续的,这篇文章介绍顺序表的实现。
顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
- C/C++代码:
功能定义
/*
* SeqList.h
* Created on: 2016年6月8日
* Author: 龙叔
*/
#ifndef SEQLIST_H_
#define SEQLIST_H_
#define FALSE 0
#define TRUE 1
#define MaxListSize 128 //设置表长最大值//
typedef int SeqListDataType; //定义一种数据类型//
/* 定义一个存放数据的数组成员 */
typedef struct {
SeqListDataType data[MaxListSize]; //存放数据的数组
int size; //当前长度
} SeqList, *PSeqList;
/*
* 初始化顺序表
*/
void InitSeqList(PSeqList pList);
/*
* 获取顺序表的长度
*/
int SeqListSize(SeqList list);
/*
* 判断顺序表是否为空
*/
int SeqListIsEmpty(SeqList list);
/*
* 直接在尾部添加元素
*/
int SeqListAdd(PSeqList pList, SeqListDataType data);
/*
* 在指定位置插入数据
*/
int SeqListInsert(PSeqList pList, int index, SeqListDataType data);
/*
* 获取指定位置的数据
*/
int SeqListGet(SeqList list, int index, SeqListDataType *data);
/*
* 修改指定位置的元素
*/
int SeqListUpdate(PSeqList pList, int index, SeqListDataType x);
/**
* 移除指定位置的元素
*/
int SeqListRemove(PSeqList pList, int index);
/*
* 清空是顺序表
*/
void SeqListClear(PSeqList pList);
/*
* 查找元素,返回数据的位置 1~MaxListSize
*/
int SeqListSearch(SeqList list, SeqListDataType data);
/*
* 小->大有序状态下二分查找,返回数据的位置 1~MaxListSize
*/
int SeqListBinarySearch(SeqList list, SeqListDataType data);
/*
* 排序(插入排序,小->大)
*/
void SeqListSort(PSeqList pList);
/*
* 逆转
*/
void SeqListReverse(PSeqList pList);
/*
* 打印顺序表内容
*/
void ShowSeqList(SeqList list);
/*
* 显示错误信息
*/
void SeqListError(char *msg);
#endif /* SEQLIST_H_ */
功能实现
/*
* SeqList.c
* Created on: 2016年6月8日
* Author: ThinkPad
*/
#include <stdio.h>
#include "SeqList.h"
void InitSeqList(PSeqList pList) {
pList->size = 0;
}
int SeqListSize(SeqList list) {
return list.size;
}
int SeqListIsEmpty(SeqList list) {
return list.size == 0;
}
int SeqListAdd(PSeqList pList, SeqListDataType data) {
if (pList->size >= MaxListSize) {
SeqListError("SeqListAdd:SeqList已满\n");
return FALSE;
}
pList->data[pList->size] = data; //添加数据
pList->size++; //长度增加
return TRUE;
}
int SeqListInsert(PSeqList pList, int index, SeqListDataType data) {
int size = pList->size;
if (index < 0 || index > MaxListSize || index > size) {
SeqListError("SeqListInsert:index范围错误\n");
return FALSE;
}
if (size >= MaxListSize) {
SeqListError("SeqListInsert:SeqList已满\n");
return FALSE;
}
int i = 0;
for (i = size; i > index; i--) {
pList->data[i] = pList->data[i - 1]; //向后移动数据
}
pList->data[i] = data; //插入数据
pList->size++; //长度增加
return TRUE;
}
int SeqListGet(SeqList list, int index, SeqListDataType *data) {
if (index < 0 || index > list.size - 1) {
SeqListError("SeqListGet:index范围错误\n");
return FALSE;
}
*data = list.data[index];
return TRUE;
}
int SeqListUpdate(PSeqList pList, int index, SeqListDataType data) {
if (index < 0 || index > pList->size - 1) {
SeqListError("SeqListUpdate:index范围错误\n");
return FALSE;
}
pList->data[index] = data;
return TRUE;
}
int SeqListRemove(PSeqList pList, int index) {
if (index < 0 || index > pList->size - 1) {
SeqListError("SeqListRemove:index范围错误\n");
return FALSE;
}
for (int i = index; i < pList->size; i++) {
pList->data[i] = pList->data[i + 1]; //向前移动
}
pList->size--; //长度减1
return TRUE;
}
void SeqListClear(PSeqList pList) {
if (!SeqListIsEmpty(*pList)) {
for (int i = 0; i < pList->size; ++i) {
pList->data[i] = 0;
}
pList->size = 0;
}
}
int SeqListSearch(SeqList list, SeqListDataType data) {
for (int i = 0; i < list.size; i++) {
if (data == list.data[i])
return i + 1;
}
return FALSE;
}
int SeqListBinarySearch(SeqList list, SeqListDataType data) {
int low = 0, high = list.size - 1;
int mid;
while (low <= high) {
mid = (low + high) / 2;
if (data == list.data[mid])
return mid + 1;
else if (data < list.data[mid])
high = mid - 1;
else if (data > list.data[mid])
low = mid + 1;
}
return FALSE;
}
void SeqListSort(PSeqList pList) {
int i, j;
SeqListDataType temp;
for (i = 0; i < pList->size - 1; ++i) {
temp = pList->data[i + 1];
j = i;
while (j > -1 && temp < pList->data[j]) {
pList->data[j + 1] = pList->data[j];
j--;
}
pList->data[j + 1] = temp;
}
}
void SeqListReverse(PSeqList pList) {
int i = 0;
int j = pList->size - 1;
SeqListDataType temp;
for (; i < pList->size / 2; i++) {
temp = pList->data[i];
pList->data[i] = pList->data[j - i];
pList->data[j - i] = temp;
}
}
void ShowSeqList(SeqList list) {
printf("ShowSeqList:\n");
for (int i = 0; i < list.size; ++i) {
printf(" %d\t", list.data[i]);
}
printf("\n");
}
void SeqListError(char *msg) {
printf("SeqListError: %s", msg);
}
功能测试
/*
* main.c
* Created on: 2016年6月8日
* Author: 龙叔
*/
#include <stdio.h>
#include "SeqList.h"
/*
* 顺序表测试
*/
void test_SeqList() {
SeqList list;
InitSeqList(&list);
for (int i = 1; i <= 10; i++) {
SeqListAdd(&list, i);
}
SeqListInsert(&list, 9, 111111111);
ShowSeqList(list);
SeqListRemove(&list, 2);
ShowSeqList(list);
SeqListUpdate(&list, 1, 3);
ShowSeqList(list);
SeqListSort(&list);
ShowSeqList(list);
SeqListDataType data = 10;
int pos = SeqListSearch(list, data);
printf("SeqListSearch:pos=%d \n", pos);
pos = SeqListBinarySearch(list, data);
printf("SeqListBinarySearch:pos=%d \n", pos);
SeqListReverse(&list);
ShowSeqList(list);
SeqListClear(&list);
ShowSeqList(list);
}
int main() {
test_SeqList();
return 0;
}
运行结果
ShowSeqList:
1 2 3 4 5 6 7 8 9 111111111 10
ShowSeqList:
1 2 4 5 6 7 8 9 111111111 10
ShowSeqList:
1 3 4 5 6 7 8 9 111111111 10
ShowSeqList:
1 3 4 5 6 7 8 9 10 111111111
SeqListSearch:pos=9
SeqListBinarySearch:pos=9
ShowSeqList:
111111111 10 9 8 7 6 5 4 3 1
ShowSeqList: