目录
顺序表是线性表的一种
分为静态顺序表和动态顺序表
代码实现(C):
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 20
typedef int ElemType;
typedef struct { //静态顺序表
ElemType data[MAXSIZE];
int lenth;
}SqList;
//初始化静态顺序表,长度不可变
void InitSqList(SqList* L)
{
L->lenth = 6;//设定初始顺序表有6个数据
for (int i = 0; i < L->lenth; i++) {
L->data[i] = i + 1;
}
}
//输出顺序表
void PrintList(SqList L)
{
for (int i = 0; i < L.lenth; i++) {
printf("data[%d]:%d ", i, L.data[i]);
}
printf("\n");
}
//顺序表第i个位置插入元素e
int SqListInsert(SqList* L, int i, ElemType e)
{
if (i < 1 || i > L->lenth + 1) return 0; //超出范围不能插入
if (L->lenth >= MAXSIZE) return 0; //表满不能插入
for (int j = L->lenth; j >= i; j--) {
L->data[j] = L->data[j - 1]; //第i个位置之后的元素后移
}
L->data[i - 1] = e;
L->lenth++;
return 1;
}
//删除第i个元素,并返回删除的元素e
int SqListDelete(SqList* L, int i, ElemType* e)
{
if (i < 1 || i > L->lenth) return 0; //超出范围不能删除
if (L->lenth == 0) return 0; //表空不能删除
*e = L->data[i - 1];
for (int j = i; j < L->lenth; j++) {
L->data[j - 1] = L->data[j];//第i个位置之后的元素前移
}
L->lenth--;
return 1;
}
//按值查找元素,并返回位序
int SqListLocateItem(SqList L, ElemType e)
{
for (int i = 0; i < L.lenth; i++) {
if (L.data[i] == e)
return i + 1;
}
return -1; //查找失败
}
int main()
{
SqList L1, L2;
int e, temp;
/*******************************插入、删除、查找成功***************************/
printf("插入、删除、查找成功测试:\n");
InitSqList(&L1);
printf("初始化顺序表成功!原顺序表为:\n");
PrintList(L1);
if (SqListInsert(&L1, 3, 100)) {//第3个位置插入100
printf("在第3个位置插入100成功!新顺序表为:\n");
PrintList(L1);
}
else {
printf("在第3个位置插入100失败!\n");
}
if (SqListDelete(&L1, 5, &e)) {//删除第5个位置的数据,并输出删除数据
printf("删除第5个位置的元素成功!删除的元素为:%d,新顺序表为:\n",e);
PrintList(L1);
}
else {
printf("删除第5个位置的元素失败!\n");
}
temp = SqListLocateItem(L1, 6);
if (temp != -1) {//查找6,并返回位序
printf("查找元素“6”成功!位序为:%d\n", temp);
}
else {
printf("查找失败!\n");
}
/****************************************************************************/
/*******************************插入、删除、查找失败***************************/
printf("\n插入、删除、查找失败测试:\n");
InitSqList(&L2);
printf("初始化顺序表成功!原顺序表为:\n");
PrintList(L2);
if (SqListInsert(&L2, 9, 999)) {//第9个位置插入999
printf("在第9个位置插入999成功!新顺序表为:\n");
PrintList(L2);
}
else {
printf("在第9个位置插入999失败!\n");
}
if (SqListDelete(&L2, 8, &e)) {//删除第8个位置的数据,并输出删除数据
printf("删除第8个位置的元素成功!删除的元素为:%d,新顺序表为:\n", e);
PrintList(L2);
}
else {
printf("删除第8个位置的元素失败!\n");
}
temp = SqListLocateItem(L2, 123);
if (temp != -1) {//查找123,并返回位序
printf("查找元素“123”成功!位序为:%d", temp);
}
else {
printf("查找元素“123”失败!\n");
}
/****************************************************************************/
system("pause");
return 0;
}
/*
typedef struct { //动态顺序表
ElemType* data;
int lenth;
int data_maxsize;
}D_SqList;
//初始化动态顺序表,长度可变
int InitDynamicSqList(D_SqList* L)
{
L->data_maxsize = 20; //设定表长为20
L->data = (ElemType*)malloc(sizeof(ElemType) * L->data_maxsize); //分配内存空间
if (L->data == NULL) return 0;
for (int i = 0; i < 6; i++) {
L->data[i] = i + 1; //设定初始顺序表有6个数据
L->lenth++;
}
return 1;
}
int IncreaseSize(D_SqList* L, int len) //增加动态顺序表长度
{
ElemType* p = L->data; //保存原数据指针
L->data = (ElemType*)malloc(sizeof(ElemType) * (L->data_maxsize + len));//新的内存数据空间
if (L->data == NULL) return 0;
for (int i = 0; i < L->lenth; i++) {
L->data[i] = p[i]; //复制原数据
}
L->data_maxsize = L->data_maxsize + len; //增加表长
free(p); //释放原数据空间
p = NULL;
return 1;
}
//动态顺序表与静态顺序表只有内存分配上的区别,增删查改操作基本一致
*/
代码实现(C++):
#include <iostream>
#define MAXSIZE 20
typedef int ElemType;
typedef struct { //静态顺序表
ElemType data[MAXSIZE];
int lenth;
}SqList;
//初始化静态顺序表,长度不可变
void InitSqList(SqList& L)
{
L.lenth = 6; //设定初始顺序表有6个数据
for (int i = 0; i < L.lenth; i++) {
L.data[i] = i + 1;
}
}
//输出顺序表
void PrintList(SqList L)
{
for (int i = 0; i < L.lenth; i++) {
std::cout << "data[" << i << "]:" << L.data[i] << " ";
}
std::cout << std::endl;
}
//顺序表第i个位置插入元素e
bool SqListInsert(SqList& L, int i, ElemType e)
{
if (i < 1 || i > L.lenth + 1) return false; //超出范围不能插入
if (L.lenth >= MAXSIZE) return false; //表满不能插入
for (int j = L.lenth; j >= i; j--) {
L.data[j] = L.data[j - 1]; //第i个位置之后的元素后移
}
L.data[i - 1] = e;
L.lenth++;
return true;
}
//删除第i个元素,并返回删除的元素e
bool SqListDelete(SqList& L, int i, ElemType& e)
{
if (i < 1 || i > L.lenth) return false; //超出范围不能删除
if (L.lenth == 0) return false; //表空不能删除
e = L.data[i - 1];
for (int j = i; j < L.lenth; j++) {
L.data[j - 1] = L.data[j];//第i个位置之后的元素前移
}
L.lenth--;
return true;
}
//按值查找元素,并返回位序
int SqListLocateItem(SqList L, ElemType e)
{
for (int i = 0; i < L.lenth; i++) {
if (L.data[i] == e)
return i + 1;
}
return -1; //查找失败
}
int main()
{
SqList L1, L2;
int e, temp;
/*******************************插入、删除、查找成功***************************/
printf("插入、删除、查找成功测试:\n");
InitSqList(L1);
printf("初始化顺序表成功!原顺序表为:\n");
PrintList(L1);
if (SqListInsert(L1, 3, 100)) {//第3个位置插入100
printf("在第3个位置插入100成功!新顺序表为:\n");
PrintList(L1);
}
else {
printf("在第3个位置插入100失败!\n");
}
if (SqListDelete(L1, 5, e)) {//删除第5个位置的数据,并输出删除数据
printf("删除第5个位置的元素成功!删除的元素为:%d,新顺序表为:\n",e);
PrintList(L1);
}
else {
printf("删除第5个位置的元素失败!\n");
}
temp = SqListLocateItem(L1, 6);
if (temp != -1) {//查找6,并返回位序
printf("查找元素“6”成功!位序为:%d\n", temp);
}
else {
printf("查找失败!\n");
}
/****************************************************************************/
/*******************************插入、删除、查找失败***************************/
printf("\n插入、删除、查找失败测试:\n");
InitSqList(L2);
printf("初始化顺序表成功!原顺序表为:\n");
PrintList(L2);
if (SqListInsert(L2, 9, 999)) {//第9个位置插入999
printf("在第9个位置插入999成功!新顺序表为:\n");
PrintList(L2);
}
else {
printf("在第9个位置插入999失败!\n");
}
if (SqListDelete(L2, 8, e)) {//删除第8个位置的数据,并输出删除数据
printf("删除第8个位置的元素成功!删除的元素为:%d,新顺序表为:\n", e);
PrintList(L2);
}
else {
printf("删除第8个位置的元素失败!\n");
}
temp = SqListLocateItem(L2, 123);
if (temp != -1) {//查找123,并返回位序
printf("查找元素“123”成功!位序为:%d", temp);
}
else {
printf("查找元素“123”失败!\n");
}
/****************************************************************************/
system("pause");
return 0;
}
/*
typedef struct { //动态顺序表
ElemType* data;
int lenth;
int data_maxsize;
}D_SqList;
//初始化动态顺序表,长度可变
bool InitDynamicSqList(D_SqList& L)
{
L.data_maxsize = 20; //设定表长为20
L.data = (ElemType*)malloc(sizeof(ElemType) * L.data_maxsize); //分配内存空间
if (L.data == NULL) return false;
for (int i = 0; i < 6; i++) {
L.data[i] = i + 1; //设定初始顺序表有6个数据
L.lenth++;
}
return true;
}
bool IncreaseSize(D_SqList& L, int len) //增加动态顺序表长度
{
ElemType* p = L.data; //保存原数据指针
L.data = (ElemType*)malloc(sizeof(ElemType) * (L.data_maxsize + len));//新的内存数据空间
if (L.data == NULL) return 0;
for (int i = 0; i < L.lenth; i++) {
L.data[i] = p[i]; //复制原数据
}
L.data_maxsize = L.data_maxsize + len; //增加表长
free(p); //释放原数据空间
p = NULL;
return true;
}
//动态顺序表与静态顺序表只有内存分配上的区别,增删查改操作基本一致
*/
结果展示:
总结:
总体来说C++的引用与布尔值更好操作一些,特别是在后面链表修改指针的时候,引用更方便,也更安全;但是C的指针也不赖,在链表修改指针的时也可以使用二级指针来操作。
以上
以上均为个人学习心得,如有错误,请不吝赐教~
THE END