数据结构——顺序表

顺序表【1】
在学习时,先了解一个什么顺序表:
定义:
       顺序表在计算机内存中的一块地址连续的存储区里,这时,线性表中逻辑上邻接的两个数据结构点,其内存中的存储点在物理位置上同样也是相邻的。
这种的存储结构在数据结构当中,我们称之为顺序表;

问题1:

          对于一个顺序表来说,应该分配给他多大的一块地址连续的内存区呢?

                                       这个问题应该由一个数据结点所需要的存储量以及数据结点的个数来确定的;

问题2:

         如果在我们计算机当中没有能够存储我们分配的这个地址连续的顺序表怎么办?

                                     如果真的出现了这样的情况,我们得换另外一种存储结构;链表


一、顺序表的插入;


如在表1当中,在顺序表中的第一个元素后面插入一个45,那行从第2个元素开始后面的元素依次就得往后移动一个位置;最后再将45插入到第一个元素后面;
如在表2当中,在顺序表中往最后一个插入一个元素那么,则采用类似的方法,将最后一个元素往后移动一个位置,然后将新元素插入到最后一个元素+1,这样
就完成了在顺序表插入一个新元素到最后的操作;

1.问题:
如果为顺序表开辟的存储空间已满,那么就不能再插入新的元素了,如果还要插入的话,那么就会造成“上溢”的错误;

顺序表的删除:
这个和顺序表的插入操作正好相反;
2.问题:如果顺序表此时没有了元素,那么就不能再删除了,如果还要删除的话,那么就会造成“下溢”的错误;

二、实际设置顺序表时,要考虑的三个插入操作的异常;
1.当存储空间已满;
2.当插入的位置大于数据元素的个数,则认为是在最后插入;
3.当插入的位置小于1,则认为是在第一个位置上进行插入操作;

c语言代码:

//向顺序表中插入元素的代码;

void inst_sq(T * v, int m, int * n, int i, T b)
		{
			int k;
			if(*n == m)  //如果存储空间已满,上溢错误
				{printf("overflow!\n");return;}
			if(i > * n) i = * n + 1; //默认在最后一个元素后插入新元素;
			if(i <   1) i = 1;       //默认在插入到第一个元素;
			for( k = *n; k >= i; k--)
				v[k] = v[k -1];
			v[i -1] = b;
			*n = *n + 1;
		return;	
		}



//在顺序表中删除元素的代码 
void del_sq(int * v, int m, int *n, int i)
		{
			int k;
			if(*n== 0)   //如果当然顺序表为空,继续进行删除操作则为下溢错误;
				{printf("underflow!\n");return;}
			if((i<1)||(i>*n)) //顺序表中没有这个元素;
				{printf("not this element in the list\n");return;}
			for(k = i; k < *n; k++)
				v[k - 1] = v[k];
			*n = *n - 1;
		return;
		}

//检测顺序表当前的状态

int flag_sq(int *n, int m)
{
	if(*n == m) return (-1); //上溢错误
	if(*n == 0) return ( 0); //下溢错误
return (1);  //状态良好
}

//输出顺序表中所有的元素;

void prt_sq(int *v, int *n)  //输出顺序表中的所以元素;
{
	int i;
	printf("element: %d\n",*n);
	for(i = *n -1; i >=0; i--)
		printf("%d\n",v[i]);
return;
}


例子:


#include <stdio.h>
#include <malloc.h>

int flag_sq(int *n, int m)
{
	if(*n == m) return (-1); //上溢错误
	if(*n == 0) return ( 0); //下溢错误
return (1);  //状态良好
}
void prt_sq(int *v, int *n)  //输出顺序表中的所以元素;
{
	int i;
	printf("element: %d\n",*n);
	for(i = *n -1; i >=0; i--)
		printf("%d\n",v[i]);
return;
}
void inst_sq( int * v, int m, int * n, int i, int b)   //向表中插入新的元素
{
	int k;
	if(m == *n)   //存储空间已满,上溢错误
		{printf("overflow!\n");return;}
	if(i > *n) i = *n + 1;   //默认在最后一个元素后插入新元素
	if(i <  1) i = 1;        //默认在第一个元素前插入新元素,则这个新元素就成为了这个顺序表中的第一元素;
	for(k = *n; k >=i; k--)
		v[k] = v[k - 1];
	v[i - 1] = b;
	*n = *n + 1;
return;
}

void del_sq(int * v, int *n, int i)
{
	int k;
	if(*n == 0)   //如果当然顺序表为空,继续进行删除操作则为下溢错误;
		{printf("underflow!\n");return;}
	if( (i < 1) || ( i> *n ) ) //顺序表中没有这个元素;
		{printf("not this element in the list\n");return;}
	for(k = i; k < *n; k++)
		v[k - 1] = v[k];
	*n = *n - 1;
return;
}

void main()
{
	int *v, n, m;   
	m = 5;
	v = (int*)malloc(m * sizeof(int));
	n = 0;
/
	             //插入操作
	if(flag_sq(&n,m)!=-1) inst_sq(v,m,&n,1,34);
	else printf("overflow!\"34\"insert fail\n");

	if(flag_sq(&n,m)!=-1) inst_sq(v,m,&n,2,334);
	else printf("overflow!\"334\"insert fail\n");
	
	if(flag_sq(&n,m)!=-1) inst_sq(v,m,&n,3,4);
	else printf("overflow!\"4\"insert fail\n");

	if(flag_sq(&n,m)!=-1) inst_sq(v,m,&n,4,94);
	else printf("overflow!\"94\"insert fail\n");

	if(flag_sq(&n,m)!=-1) inst_sq(v,m,&n,5,4534);
	else printf("overflow!\"4534\"insert fail\n");

	if(flag_sq(&n,m)!=-1) inst_sq(v,m,&n,6,100);  //此时再插入100将造成上溢错误,我们通过flag来判断;
	else printf("overflow!\"100\"insert fail\n");
	printf("------------------------------------------\n");
	prt_sq(v,&n);

			//删除操作

	if(flag_sq(&n,m)!=1)   //删除第一个元素
	{
		del_sq(v,&n,1);
		printf("delete succeed\n");
		printf("--------------------------\n");
		prt_sq(v,&n);
	}
	else printf("underflow!\"1\"delete fail\n"); 

	printf("The rest of the elements\n");   //输出顺序表当中剩下的元素;
	prt_sq(v,&n);

}
/*---------------运行结果-------------
overflow!"100"insert fail
----------------------------------
element: 5
4534
94
4
334
34
delete succeed
--------------------------
element: 4
4534
94
4
334
The rest of the elements
element: 4
4534
94
4
334
Press any key to continue
总结:
    顺序表虽然是一种很简单实用性很强的一种数据结构但是他也有着缺点,其有几点:
                            1.如果在计算机中没有连续能够存储我们顺序表的空间。
                            2.如果我们分配的空间如果不够我们使用怎么办
                            3.如果我们分配的空间太小不够我们使用怎么办
通过上面的三点,可以想像顺序表虽然是很好用,但也受着一些不定的因素的原因,使其在实用性方面有着很多的限制;
如果我们的数据能够有一定的范围的话,那么使用顺序表无疑是一个不错的选择;

*/



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值