数据结构>>>顺序表的实现>>顺序存储.

顺序数组:

  • 结构描述
  • 初始化
  • 插入\删除
  • 倒置
  • 查找
  • 排序(冒泡)

下面是具体实现:

  1. 结构描述:
typedef struct{
	int *felem;//第一个元素地址
	int len;//数组的最大容纳量
	int cnt;//当前数组有效元素个
}sqlist;

2.初始化:

void init_sqlist(sqlist *L ,int length)
{
	L->felem =(int *)malloc(sizeof(int)*length);
	if(L->felem==NULL)
	{
		cout<<"动态内存分配失败!"<<endl;
		exit(-1);
	}
	else
	{
		L->len =length;
		L->cnt =0;
	}
	return ;
}

3.插入/删除:

bool insert_sqlist(sqlist *L,int pos,int val)
{
	int i;
	cout<<"请输入需要插入元素的位置和值"<<endl;
	cin>>pos>>val;
	if(is_full(L))
		return false;
	if(pos<1||pos>L->cnt +1)
		return false;
	for(i=L->cnt -1;i>=pos-1;--i)
		L->felem [i+1]=L->felem [i];
	L->felem [pos-1]=val;
	L->cnt ++;
	return true;
}

bool delete_sqlist(sqlist *L,int pos,int *pval)
{
	//bool is_empty(sqlist *L);
	int i;
	if(is_empt(L))
		return false;
	if(pos<1||pos>L->cnt)
		return false;
	*pval=L->felem [pos-1];
	for(i=pos;i<L->cnt ;++i)
		L->felem [i-1]=L->felem [i];
	L->cnt--;
	return true;
}

4.倒置:

void inversion_sqlist(sqlist *L)
{
	int i=0;
	int j=L->cnt -1;
	int t;
	while(i<j)
	{
		t=L->felem [i];
		L->felem [i]=L->felem [j];
		L->felem [j]=t;
		++i;
		--j;
	}
	return ;
}

5.查找:

int locate_sqlist(sqlist L,int e)
{
	int i=1;
	while(i<=L.len &&L.felem [i-1]!=e)
		i++;
	if(i<=L.len )
		return i;
	else
		return 0;
}

6.排序(冒泡)

void sort_sqlist(sqlist*L)
{
	int i,j,t;
	for(i=0;i<L->cnt ;i++)
	{
		for(j=i+1;j<L->cnt ;++j)
		{
			if(L->felem [i]>L->felem [j])
			{
				t=L->felem [i];
		        L->felem [i]=L->felem [j];
		        L->felem [j]=t;
			}
		}
	}
}

------》源代码:

#include<iostream>
#include<malloc.h>
#include<stdlib.h>
using namespace std;

//1.结构描述:
typedef struct{
	int *felem;//第一个元素地址
	int len;//数组的最大容纳量
	int cnt;//当前数组有效元素个
}sqlist;

//2.初始化:
void init_sqlist(sqlist *L ,int length)
{
	L->felem =(int *)malloc(sizeof(int)*length);
	if(L->felem==NULL)
	{
		cout<<"动态内存分配失败!"<<endl;
		exit(-1);
	}
	else
	{
		L->len =length;
		L->cnt =0;
	}
	return ;
}

//判空:
bool is_empt(sqlist *L)
{
	if(L->cnt==0)
		return true;
	else
		return false;
}

//判满:
bool is_full(sqlist *L)
{
	if(L->cnt==L->len)
		return true;
	else
		return false;
}

//显示:
void show_sqlist(sqlist *L)
{
	if(is_empt(L))
		cout<<"数组为空!"<<endl;
	else
	{
		for(int i=0;i<L->cnt ;++i)
			cout<<L->felem [i]<<'\t';
		cout<<endl;
	}
}

//填充:
bool fill_sqlist(sqlist *L,int val)
{
	if(is_full(L))
		return false;
	L->felem [L->cnt ]=val;
	(L->cnt )++;
	return true;
}

//3.插入/删除:
bool insert_sqlist(sqlist *L,int pos,int val)
{
	int i;
	cout<<"请输入需要插入元素的位置和值"<<endl;
	cin>>pos>>val;
	if(is_full(L))
		return false;
	if(pos<1||pos>L->cnt +1)
		return false;
	for(i=L->cnt -1;i>=pos-1;--i)
		L->felem [i+1]=L->felem [i];
	L->felem [pos-1]=val;
	L->cnt ++;
	return true;
}

bool delete_sqlist(sqlist *L,int pos,int *pval)
{
	//bool is_empty(sqlist *L);
	int i;
	if(is_empt(L))
		return false;
	if(pos<1||pos>L->cnt)
		return false;
	*pval=L->felem [pos-1];
	for(i=pos;i<L->cnt ;++i)
		L->felem [i-1]=L->felem [i];
	L->cnt--;
	return true;
}

//4.倒置:
void inversion_sqlist(sqlist *L)
{
	int i=0;
	int j=L->cnt -1;
	int t;
	while(i<j)
	{
		t=L->felem [i];
		L->felem [i]=L->felem [j];
		L->felem [j]=t;
		++i;
		--j;
	}
	return ;
}

//5.查找:
int locate_sqlist(sqlist L,int e)
{
	int i=1;
	while(i<=L.len &&L.felem [i-1]!=e)
		i++;
	if(i<=L.len )
		return i;
	else
		return 0;
}

//6.排序(冒泡)
void sort_sqlist(sqlist*L)
{
	int i,j,t;
	for(i=0;i<L->cnt ;i++)
	{
		for(j=i+1;j<L->cnt ;++j)
		{
			if(L->felem [i]>L->felem [j])
			{
				t=L->felem [i];
		        L->felem [i]=L->felem [j];
		        L->felem [j]=t;
			}
		}
	}
}

int main()
{

	int val=2,pos,len,x,loc;
	len=10;pos=5;
    sqlist sq;
	init_sqlist(&sq,len);
	show_sqlist(&sq);

	fill_sqlist(&sq,1);
    fill_sqlist(&sq,-3);
	fill_sqlist(&sq,6);
	fill_sqlist(&sq,45);
	fill_sqlist(&sq,13);
	fill_sqlist(&sq,34);
	if(fill_sqlist(&sq,36))
		cout<<"填充成功!"<<endl;
	else
		cout<<"填充失败!"<<endl;
	cout<<"填充之后的数组内容是:"<<endl;
	show_sqlist(&sq);

	if(insert_sqlist(&sq,pos,val))
	{
		cout<<"插入成功!"<<endl;
		cout<<"插入的元素是第"<<pos<<"个元素"<<endl;
		cout<<"插入的元素是:"<<val;
	}
	else
		cout<<"插入失败!"<<endl;
	cout<<"插入之后的数组内容是:"<<endl;
	show_sqlist(&sq);

	if(delete_sqlist(&sq,pos,&val))
	{
		cout<<"删除成功!"<<endl;
		cout<<"删除的元素是第"<<pos<<"个元素"<<endl;
		cout<<"删除的元素是:"<<val<<endl;
	}
	else
		cout<<"删除失败!"<<endl;
	cout<<"删除之后的数组内容是:"<<endl;
	show_sqlist(&sq);


	inversion_sqlist(&sq);
	cout<<"倒置之后的数组内容是:"<<endl;
	show_sqlist(&sq);


	cout<<"请输入需要查找的元素的值:"<<endl;
	cin>>x;
	loc=locate_sqlist(sq,x);
	if(loc>0)
	{
		cout<<"找到了!"<<endl;
		cout<<x<<"是线性表中第"<<loc<<"个元素"<<endl;
	}
	else
		cout<<"查找失败!"<<endl;

	sort_sqlist(&sq);
	cout<<"排序之后的数组内容是:"<<endl;
	show_sqlist(&sq);
	return 0;
}

***需要注意的点:
###不明确的符号简单地说,出现这种情况是因为程序使用的命名空间里已经有这个变量名了,换掉这个变量名吧,选个不那么坑爹的变量名2,指定命名空间,这样编译器就能知道到底是哪个命名空间的变量了。(is_empty()函数在c++的<iostream>库文件中已有定义,所以这里我们给判空函数命名为is_empt(),否则会产生歧义。

数据结构的顺序表是最基础的结构为其他高级结构以及一些算法的实现提供了地基。

猜你喜欢

转载自blog.csdn.net/qq_43595030/article/details/90726213