数据结构-----顺序表的定义与实现

顺序表:把逻辑相邻的元素储存在物理结构位置也相连的存储单元。

顺序表的静态分布内存定义方式(缺点:无法解决数组存满了问题) 

#include<stdio.h>
#define MAX_BUF 10
//定义一种类型 
	typedef struct {
		int data[MAX_BUF];//最大长度 
		int len;//现长度 
	}Sqlist;
void InitList(Sqlist &L)
{
	for(int i = 0; i < MAX_BUF; i++)
	{
		L.data[i] = 0;//将所有数据设为0 防止分配的内存处存在脏数据 
	}
	L.len= 0;//当前初始化时顺序表长度为0 
 } 
int main()
{
	Sqlist L; 
	InitList(L) ;
	return 0;
} 

建立在静态内存分布之上的顺序表的插入 

注意:此时插入的位置i必须大于等于1,并且不可超过最大长度。注意插入之后表长是否超出最大长度,若超出,会导致数据丢失,此为静态定义顺序表的弊端,需特别注意最大长度问题。 

 //思路:将第i个元素往后移动 再将e填入i的位置 记得增加长度
 // 应该从最后一个元素开始移动  
bool ListInsert(Sqlist &L,int i,int e)
 {
 	//此处i代表的是位置 i应该[1,MAX_BUF] 
 	if(i < 1 || i > MAX_BUF)
 	return false;
 	for(int j = L.len;j >= i; j--)
 	{
 		L.data[j] = L.data[j-1];
 		
	 }
	 //位置i在数组中下标应该为i-1 
	 L.data[i-1] = e;
	 L.len++;
 }

 建立在静态内存分布之上的顺序表的删除

 //遍历找到该数据 找到之后将其带给e 并且删除 i位置之后的元素都将向前移动位次
 //从前开始移动 
bool deleteList(Sqlist &L,int i,int &e)
{
	if(i < 1 || i > L.len)
	return false;
	//位置i在数组中下标应该为i-1 
	e = L.data[i-1];
	for(int j = i;j < L.len;j++)
	{
		L.data[j-1] = L.data[j];
	}
	L.len--;
	return true;
}

 建立在静态内存分布之上的顺序表的查找:按值查找和按位查找 

//按位置查找
int GetElem(Sqlist &L,int i)
{
	return L.data[i-1];
}
//按照值来查找
int LocateElem(Sqlist &L,int e)
{
	for(int i = 0; i < L.len; i++)
	{
		if(L.data[i] == e)
		{
			return i+1;
		
		}
	}
}

顺序表的动态内存分布(优点:可扩大表的长度 缺点:时间开销大) 

#include<stdio.h>
#include<iostream>
using namespace std;
#define MAX_BUF 10 
typedef struct {
	int * data;//指示动态分布数组的指针 
	int len;
	int Max_Size;
}Sqlist;
//要为data动态分配存储空间 
void InitList(Sqlist &L)
{
	L.data = (int *)malloc(sizeof(int)*L.Max_Size );
	L.len = 0;
	L.Max_Size = MAX_BUF;
}
//思路:首先定义指针p存原来L里面的数据,然后再动态将L空间加大 将 p中数据还给L 最后不要忘记更改长度和释放p 
void IncreaseList(Sqlist &L,int length)
{
	int * p = L.data;
	L.data = (int*) malloc(sizeof(int) *(L.Max_Size + length));
	for(int i = 0; i < L.len;i++)
	{
		L.data[i] = p[i];
	}
	L.Max_Size += length;
	free(p);
}
int main()
{
	Sqlist L;
	InitList(L);
	cout << L.len  << " " << L.Max_Size << endl;
	int length = 10;
	IncreaseList(L,length);	
	cout << L.len << " " << L.Max_Size;
}

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值