数据结构2-动态生成顺序表的实例与分析

动态创建一个顺序表,并完成插入和删除的操作。代码如下:

#include"stdio.h"
#include"conio.h"
#define MaxSize 10
typedef int ElemType;/*将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+1)
		exit(0);
	delItem=&(L->elem[i-1]);
	q=L->elem+L->length-1;
	for(++delItem;delItem<=q;++delItem)
		*(delItem-1)=*delItem;
	L->length--;
}

/* 测试函数 */
main(){

	Sqlist l;
	int i;
	initSqlist(&l);
	for(i=0;i<15;i++)
		InsertElem(&l,i+1,i+1);
	printf("\nThe content of the list is\n");
	for(i=0;i<l.length;i++)
		printf("%d ",l.elem[i]);
	DelElem(&l,5);
	printf("\nDelete the fifth element\n");
	for(i=0;i<l.length;i++)
		printf("%d ",l.elem[i]);
	system("pause");
	exit(0);
}


 

实例的分析与说明:

1.本程序虽然是动态生成,但是本质上还是一个顺序表,也就是它在本质上是一个数组,所以数组的特性它都有,可以随机访问。

2.q=L->elem+L->length-1;语句的解释:q指向的是顺序表的最后一个元素,由于q是一个指针而不是一个元素,所以它指向的是地址,那么就需要基地址+顺序表长度,就是最后一个元素的地址了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值