数据结构笔记1:顺序表的动态扩容、插入、删除、按值查找、按位查找操作

此C++程序定义了一个动态顺序表,实现了动态增加数组长度,实现插入、删除、查找操作。

#include <iostream>
#include<stdlib.h>
using namespace std;
#define InitSize 10
typedef struct{
	int *data;//指示动态分配数组的指针 
	int Maxsize;//顺序表的最大容量 
	int length;//顺序表的当前长度 
}SeqList;
//初始化数组 
void InitList(SeqList &L){
	//用malloc函数申请一片连续的存储空间
	L.data=(int *)malloc(InitSize*sizeof(int));
	L.length=0;
	L.Maxsize=InitSize; 
}
//增加动态数组的长度 ,咸鱼老师说realloc有坑,所以此处再次用了malloc 
void IncreaseSize(SeqList &L,int len){
	int *p=L.data;
	L.data=(int *)malloc((L.Maxsize+len)*sizeof(int));
	for(int i=0;i<L.length;i++){
		L.data[i]=p[i];//将数据复制到新区域 
	}
	L.Maxsize=L.Maxsize+len;//顺序表最大长度增加len 
	free(p); //释放原来的内存空间 
} 
//插入操作
bool ListInsert(SeqList &L,int i,int e){
	if(i<1||i>L.length+1){//判断i是否有效 
		return false;
	}
	//if(L.length>= L.Maxsize){//当前存储空间已满,不能插入 
		//return false;
	//}
	if(L.length>=L.Maxsize){
		IncreaseSize(L,10);//动态扩大数组空间,如果数据个数大于数组最大空间,每次加10个 
	} 
	for(int j=L.length;j>=i;j--){//将地i个元素及以后的元素后移 
		L.data[j]=L.data[j-1];
	}
	L.data[i-1]=e;//在位置i处放置e 
	L.length++;//表长度加1 
	return true;
} 
//删除操作
bool ListDelete(SeqList &L,int i,int &e){
	if(i<1||i>L.length+1){//判断i是否有效 
		return false;
	}
	e=L.data[i-1];
	for(int j=i;j<=L.length;j++){//将地i个元素以后的元素前移 
		L.data[j-1]=L.data[j];
	}
	L.length--;
	return true; 
} 
//查找操作
//按值查找
int LocateElem(SeqList L,int e){
	int i;
	for(i=0;i<L.length;i++){
		if(L.data[i]==e){
			//return i+1;//下标为i的元素值等于e,返回其位序i+1
			cout<<"查找到"<<e<<" ,在顺序表的第"<<i+1<<" 位.\n";
		}
	}
	return 0;
} 
//按位查找
int GetElem(SeqList L,int i){
	//return L.data[i-1];//第i位元素的值为data【i-1】
	cout<<"查找到顺序表第"<<i<<"位的元素,其值为"<<L.data[i-1]<<"."; 
} 


int main(){
	SeqList L;
	InitList(L);//初始化顺序表 
	//往顺序表中插入几个元素,此处方法不一,随机传入random,scanf输入都可实现。 
	int i,n,t;
	for (int i = 0; i <10 ;i++){//插入10个元素,自定义插入 
        ListInsert(L, i + 1, i + 1);}
    printf("原顺序表内容为:\n");
    for (int i = 0; i < L.length; i++){ 
        printf("data[%d]=%d\n",i,L.data[i]);} 
    //单独插入操作,观其变化。 
	ListInsert(L,1,5);
	printf("插入数据之后顺序表内容为:\n");
    for(i=0;i<L.length;i++){  //输出顺序表的内容
        printf("data[%d]=%d\n",i,L.data[i]);
    }
    //调用删除操作 
	int e=-1;
	if(ListDelete(L,3,e)){
		printf("已删除第三个元素,删除元素值为=%d\n",e);
	}
	else{
		printf("位序i不合法,删除失败\n");
	}
    printf("删除数据之后顺序表内容为:\n");
    for(i=0;i<L.length;i++){  //输出顺序表的内容
        printf("data[%d]=%d\n",i,L.data[i]);
    }
    //调用查找操作
	LocateElem(L,4);//查找值为2的数 
	GetElem(L,3);//查找顺序表第三位数 
	return 0; 
}

请忽略我这满屏的注释,因为刚开始学不久,为自己看的更明白一些,在合作开发时,必要的注释可以有利于队友修改代码。
运行结果如下图,若线性表长度为n,则程序时间复杂度为o(n);
在这里插入图片描述

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值