本贴记录数据结构-线性表的学习代码
PS:根据网络课程自学,使用c/c++语言混合编写,但大量代码还是以c为主。
顺序表
目录
目录
1.包含头文件
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define SMaxSize 10 //静态定义最大长度
using namespace std;
2.定义结点
1、静态分配
//静态分配
typedef struct {
int data[SMaxSize]; //用静态的"数组"存放数据元素
int length; //顺序表的当前长度
}SqList; //顺序表的类型定义(静态分配方式
2.动态分配
//动态分配
typedef struct {
int *data; //指示动态分配数组的指针
int MaxSize; //顺序表的最大容量
int length; //顺序表的当前长度
}SeqList; //顺序表的类型定义(动态分配方式
//C-malloc、free C++-new、delete
3.初始化
1.静态
//基本操作--静态 初始化一个顺序表L
void SInitList(SqList &SL)
{
for (int i = 0;i < SMaxSize;i++)//静态的设置默认值
SL.data[i] = 0; //将所有数据元素设置为默认初始值
SL.length = 0; //顺序表的初始长度为0
2.动态
#define InitSize 10 //顺序表初始长度
//基本操作--动态 初始化一个顺序表L
void DInitList(SeqList &L)
{
L.data=(int *)malloc(InitSize*sizeof(int));//C动态分配地址
//L.data=new int[InitSize];//c++动态分配
L.length = 0;
L.MaxSize=InitSize;
}
4.增加动态数组长度
//增加动态数组长度
void IncreaseSize(SeqList &DL, int len)
{
int *p=DL.data;//指向数据
DL.data =(int *)malloc((DL.MaxSize+static_cast<long long>(len))*sizeof(int)); //重新申请一片区域
if (DL.data)
for (int i = 0;i < DL.length;i++)
DL.data[i]=p[i]; //将数据复制到新区域
DL.MaxSize=DL.MaxSize+len; //将最大值+新增加数
free(p); //释放原来的内存空间
}
5.插入操作
//基本操作--插入
bool ListInsert(SqList &SL, int i, int e)//在L的第i处插入元素e
{
if(i<1||i>SL.length+1) //判断i的范围是否有效
return false;
if(SL.length>=SMaxSize) //判断当前空间是否存满
return false;
for(int j=SL.length;j>=i;j--) //将第i个元素及之后的元素向后移
SL.data[j]=SL.data[j-1];
SL.data[i-1]=e; //在i处放入e
SL.length++; //长度加1
return true;
}
6.删除操作
//基本操作--删除操作
bool ListDelete(SqList &SL, int i,int &e) //将第i处的元素删除并用e表示
{
if(i<1||i>SL.length) //判断i的范围是否合法
return false;
e=SL.data[i-1]; //将被删除的元素赋值给e
for(int j=i;j<SL.length;j++) //将第i个位置后的元素向前移
SL.data[j-1]=SL.data[j];
SL.length--; //length减一
return true;
}
7.按位查找
//基本操作--按位查找
int GetElem(SqList& SL, int i)
{
if (i<1 || i>SL.length) //判断i的位序
{
cout << "i的位序错误" << endl;//提示位序错误
return 0;
}
return SL.data[i-1]; //返回查找值
}
8.按值查找
//基本操作--按值查找
int LocateElem(SeqList DL, int e)
{
for(int i=0;i<DL.length;i++) //遍历数组
if(DL.data[i]==e) //如果相等
return i+1; //则返回位序i+1
return 0;
}
主函数
int main()
{
SqList SL; //静态声明一个顺序表
SeqList DL; //动态声明一个顺序表
SInitList(SL); //初始化静态顺序表
DInitList(DL); //初始化动态顺序表
//插入数据
SL.data[0] = {1};
DL.data = { 0};
IncreaseSize(DL,5); //增加动态数组长度
ListInsert(SL,3,3); //按位插入元素
//删除元素
int e=-1;//用变量e表示被删除元素
if (ListDelete(SL,3,e))
cout << "已删除第3个元素,值为"<< e << endl;
else
cout << "位序不合法,删除失败" << endl;
GetElem(SL,3);//按位查找
LocateElem(DL, e);//按值查找
return 0;
}