最近在复习数据结构,准备把书上的核心代码都实现一遍,大家一起交流学习。
今天的内容是线性表的顺序储存C/C++语言实现,使用动态分配方式。
不说废话,直接上代码:
Seqlist.h
//Seqlist.h
#pragma once
#include<stdlib.h>
#include<iostream>
using namespace std;
#define MAXSIZE 100 //初始最大分配
#define INCREAMENT 10 //容量不够时,重新分配的增长长度
typedef struct {
int* data; //顺序表头指针
int length; //顺序表数据容量,表长度
int listsize; //顺序表空间大小
}SqList;
//初始化表
bool InitList(SqList& L);
//在第i个位置,插入元素e
bool InsertList(SqList& L, int i, int e);
//删除第i个位置的元素,用e保存返回值
bool DeleteList(SqList& L, int i, int& e);
//定位元素e所在位置,用i保存返回值
bool LocateElem(SqList L, int& i, int e);
//遍历输出顺序表
bool PrintList(SqList L);
Seqlist.cpp
//Seqlist.cpp
#include"Seqlist.h"
//初始化表
bool InitList(SqList& L)
{
L.data = (int*)malloc(MAXSIZE * sizeof(int)); //初始分配MAXSIZE个连续的内存空间
if (!L.data)
return false;
L.length = 0; //初始化表长度为0
L.listsize = MAXSIZE; //初始化表容量为MAXSIZE(100)
return true;
}
//在第i个位置,插入元素e
bool InsertList(SqList& L, int i, int e)
{
if (i<1 || i>L.length + 1) //判断插入位置是否合法
return false;
if (L.length >= L.listsize) //判断表长是否超过表容量
{
int* newbase;
newbase = (int*)realloc(L.data, (L.listsize + INCREAMENT) * sizeof(int)); //超过就增长表容量
L.data = newbase; //表头指针重新赋值
L.listsize += INCREAMENT; //修改表容量
}
//从插入位置开始依次将元素后移一位,初学者好好体会for循环中j值的变化
for (int j = L.length; j >= i; j--)
L.data[j] = L.data[j - 1];
L.data[i - 1] = e; //将元素插入既定位置
L.length++; //表长加1
return true;
}
//删除第i个位置的元素,用e保存返回值
bool DeleteList(SqList& L, int i, int& e)
{
if (i<1 || i>L.length) //判断删除位置是否合法
return false;
e = L.data[i - 1]; //先保存删除元素
for (int j = i; j < L.length; j++) //将表中元素依次前移一位
L.data[j - 1] = L.data[j];
L.length--; //表长减1
return true;
}
//定位元素e所在位置,用i保存返回值
bool LocateElem(SqList L, int& i, int e)
{
//依次遍历表,找到与e相等的元素位置
for (int j = 0; j < L.length; j++)
{
if (L.data[j] == e)
{
i = j + 1;
return true;
}
}
return false;
}
//遍历输出顺序表
bool PrintList(SqList L)
{
for (int i = 0; i < L.length; i++)
cout << L.data[i] << " ";
cout << endl;
return true;
}
主函数简单演示
main.cpp
#include"Seqlist.h"
int main()
{
SqList L;
InitList(L); //初始化表
for (int i = 0; i < 10; i++)
InsertList(L, i, i); //插入元素
PrintList(L); //遍历表输出
int j, e;
cout << "请输入要删除元素位置:";
cin >> j;
DeleteList(L, j, e);
PrintList(L);
int m, n = -1;
cout << "请输入要查找元素:";
cin >> m;
LocateElem(L, n, m);
cout << endl << n;
return 0;
}