再学数据结构之顺序表(二)

  上一次复习了数据结构中顺序表的概念,包括怎么样构造一个顺序表。这一次就主要学习了一下顺序表的插入与删除。

  对顺序表的增加呢,做法如下:

  例如要在一个顺序表的第i个位置插入一个元素,那么首先需要将i-1以后的元素顺序后移一个元素的位置,然后在第i个位置插入新元素,最后给表长加1。但我们要注意的是,在插入之前首先要判断插入的合法性。比如这个顺序表的长度为n,那么插入元素的位置是1~n+1,如果i<1或者i>n+1,或者n=MaxSize(表满),这样插入都是非法的,程序应该直接退出。如果插入的位置是合法的,那么首先将表的i-1以后的元素顺序后移一个元素的位置,即,将顺序表从第i个元素到第n个元素顺序后移一个位置。然后在表第i个位置(其下标为i-1),并将表长加1.

  那删除操作也是同理,首先判断它是否为非法删除,判断一个需要删除的元素是否合法。对于一个长度为n的顺序表,删除元素的合法位置是1~n,因此如果i<1或者i>n都是不合法的。 执行删除操作首先将第i位置以后的元素,依次前移,这样第i个元素就会被覆盖,也就起到了删除第i个位置元素的作用,最后将表长-1..


/*静态顺序表的各种操作*/
/*实例:
	创建一个静态的顺序表存放整数,大小为10,完成以下的操作。
	(1)输入6个整数,打印出顺序表中的内容,并显示表中剩余的空间个数
	(2)在顺序表中的第3个位置插入元素0,打印出顺序表中的内容,并显示表中剩余的空间个数
	(3)再试图向表中第11个位置插入整数0,程序提示超出范围
	(4)删除表中第6个元素,打印出顺序表中的内容,并显示表中剩余的空间个数
*/
#include "stdio.h"
#define MaxSize 10
/*
参数Sqlist:表的首地址
参数*len:表的长度
参数i:插入元素的位置
参数x:待插入的元素值
*/
void insertElem(int Sqlist[],int *len,int i, int x)
{
	int t;
	if(*len == MaxSize || i<1 || i>*len+1)
	{
		printf("This insert is illegal\n");
		return;  //非法插入
	}
	for(t = *len-1;t>=i-1;t--)
	{
		Sqlist[t+1] = Sqlist[t];
	}
	Sqlist[i-1]=x;   //插入元素
	*len = *len+1;  //表长+1
}

void DelElem(int Sqlist[],int *len,int i)
{
	int j;
	if(i<1 || i>*len)
	{
		printf("This insert is illegal");
		return;  //非法插入
	}
	for(j=i;j<*len-1;j++)
	{
		Sqlist[j-1] = Sqlist[j];   
	}
	*len = *len-1;   

}

//测试函数
void main()
{
	int  Sqlist[MaxSize];  //定义一个静态顺序表
	int len;
	int i;
	printf("please input six integer number \n");

	for(i=0;i<6;i++)
		scanf("%d",&Sqlist[i]);

	len=6;
	for(i=0;i>len;i++)
		printf("%d ",Sqlist[i]);
	printf("\n The spare length is %d\n",MaxSize - len);   // 显示表中剩余空间

	insertElem(Sqlist,&len,3,0);  // 在表中第3位置插入整数0 
	for(i=0;i<len;i++)
	  printf("%d ",Sqlist[i]);   //输出表中所有元素

	insertElem(Sqlist,&len,11,0); //在表中第11位置插入整数0
	DelElem(Sqlist,&len,6);  //删除顺序表中第6个元素

	for(i=0;i<len;i++)
		printf("%d ",Sqlist[i]);

	printf("\n The spare Length is %d \n",MaxSize - len);
}


那么动态的顺序表的插入删除则是同理,实例见下面,相信大家也很容易看懂逻辑了。

/*
动态创建一个顺序表
要求:顺序表的初始长度为10,向顺序表中输入15个整数,并打印出来。再删除表中第5个元素,打印删除后的结果
*/

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define MaxSize 10
typedef int ElemType;

typedef struct{
int *elem;
int length;
int listsize;
} Sqlist;

// 初始化一个顺序表  参数L:Sqlist类型的指针

void initSqlist(Sqlist *L)
{
	L->elem = (int *)malloc(MaxSize*sizeof(ElemType));
	if(!L->elem) 
		exit(0);
	L->length = 0;
	L->listsize=MaxSize;
}

//向顺序表中插入 元 素 
/*
参数L:Sqlist类型的指针
参数i:插入元素的位置
参数item:插入的元素
*/

void InsertElem(Sqlist *L,int i, ElemType item)
{
	//向顺序表L中的第i个位置插入元素item

	ElemType *base,* insertPtr,*p;
	if(i<1 || i>L->length+1)
		exit(0);
	if(L->length >= L->listsize)
	{
		base = (ElemType*)realloc(L->elem,(L->listsize+10)*sizeof(ElemType));
		L->elem = base;
		L->listsize = L->listsize+100;
	}

	insertPtr = &(L->elem[i-1]);                                                                
	for(p=&(L->elem[L->length-1]);p>=insertPtr;p--)
		*(p+1)=*p;
	* insertPtr =item;
	L->length++;
}

/*
从顺序表中删除元素
参数L:Sqlist类型的指针
参数i:删除元素的位置
*/

void DelElem(Sqlist *L,int i)
{
	//从顺序表L中删除第i个元素
	ElemType *delItem, *q;
	if(i<1 || i>L->length)
		exit(0);  
	delItem = &(L->elem[i-1]);
	q=L->elem+L->length-1;
	for(++delItem; delItem<=q; ++ delItem)
		*(delItem-1)=* delItem;
	L->length--;
}

//测试函数
void main()
{
	Sqlist l;
	int i;
	initSqlist(&l);   // 初始化一个顺序表
	for(i=0;i<15;i++)
		InsertElem(&l,i+1,i+1);    //向顺序表中插入1~15
	printf("The context of the list is\n");
	for(i=0;i<l.length;i++)
		printf("%d ",l.elem[i]);   //打印顺序表中的内容
	
	DelElem(&l,5);  //删除第5个元素(内容为5)
	printf("\nDelete the fifth element\n");
	for(i=0;i<l.length;i++)
		printf("%d ",l.elem[i]);
	getchar();
}

以上2个实例代码都是调试通过的。大家可以自己动手试试写几个测试的函数。  


写在后面:

  其实博主也不是大一的新生了,今年已经走上了工作岗位,无奈自己水平太菜 ,找到的工作基本都无关数据结构与算法。博主也经常和女朋友讨论什么对编程是最重要的呢,我们两个都认为,就是分析问题,解决问题。那么就算是平时用不到,也要努力学习算法和数据结构以及数学。(因为我觉得长时间不学数学,智力真的会下降的!)

尽管上面的代码,帮不了你搭一个网站,甚至不能帮你完成一次小作业。但是,聚沙成塔,这些东西学到脑子里,肯定是没错的!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值