数据结构线性表的动态顺序实现增删改查

#include<stdio.h>
#include<stdlib.h>
#define TRUE 1 
#define FALSE 0
#define OK 1 
#define ERROR 0 
#define OVERFLOW -2
#define LIST_INIT_SIZE 100 
#define LISTINCREMENT 10
typedef int Status ;
typedef int ElementType ;

/*--------线性表的数组表示方式--------------*/
typedef struct  {
	ElementType * elem ;
	int length ;
	int listSize ;
}SqList;


/*--------------构造空的链表--------------*/
Status InitList_sql(SqList &l){
	//构造一个空的线性表
	l.elem =(ElementType*) malloc(LIST_INIT_SIZE*sizeof(ElementType));
	if(!l.elem) exit(OVERFLOW);
	//线性表元素的个数
	l.length = 0;
	//线性表的空间大小
	l.listSize= LIST_INIT_SIZE ;
	
	return OK ;
}

/*--------------插入-------------------*/
/*
	在第i个元素之前插入元素 elem 
*/
Status insert(SqList &l,int i ,ElementType elem){
	//插入位置不正确
	if(i<1|| i> l.listSize+1) return ERROR ;

	if(l.length>=l.listSize){//线性表空间已满
		//此时开辟空间
		ElementType *newBase = (ElementType*) realloc(l.elem,(l.listSize+LISTINCREMENT)*sizeof(ElementType));
		if(!newBase) exit(OVERFLOW);   //分配地址失败
		l.elem = newBase ;  //新的基址
		l.listSize += LISTINCREMENT ;//增加存储容量
	} 

	ElementType *q = &(l.elem[i-1]); //插入元素的位置
	ElementType *p ;

	for(p=&l.elem[l.length-1];p>=q;p--){
		*(p+1)=*p ;
	}
	l.elem[i-1] = elem ;
	++l.length ;
	return OK ;
}
/*----------删除列表中某一位置上的元素------------*/
/*
	删除链表第i个位置上的元素,并且返回此元素的值
*/
Status Delete(SqList &l,int i,ElementType &elem){
	if(i<1||i>l.length)return ERROR ; //删除的位置不合法
	ElementType *delEle = &(l.elem[i-1]) ;
	ElementType e = *delEle ;
	for(*delEle; *delEle<l.length;delEle++){
		*(delEle-1)=*delEle ;
	}
	--l.length ;
	return OK;
}
/*------------打印链表---------------------*/
Status List(SqList &l){
	ElementType  i;
	for(i=0 ;i<l.length;i++){
		printf("%d\t",l.elem[i]);
	}
	return OK ;
}


void main(){
	SqList l ;

	if(InitList_sql(l))
		printf("初始化链表成功!\n");

	int i ;
	
	for(i=0;i<10;i++){ //循环插入数据
		insert(l,i+1, i);
	}
	
	List(l);

	printf("删除之后的链表数据为:\n");
	int elem ;
	Delete(l,3, elem);
	List(l);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值