数据结构【1】线性表

本贴记录数据结构-线性表的学习代码


PS:根据网络课程自学,使用c/c++语言混合编写,但大量代码还是以c为主。

顺序表


目录

目录

顺序表

目录

1.包含头文件

2.定义结点

1、静态分配

2.动态分配

3.初始化

1.静态

2.动态

4.增加动态数组长度

5.插入操作

6.删除操作

7.按位查找

8.按值查找

主函数


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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值