顺序表C语言实现(增删改查实现)

#include <stdio.h>
#include <string.h> 
#include <stdlib.h>
#define M 100
#define error 0xfffffff
typedef struct node{
	int *data;   // int data[M]    静态分配 
	int Maxsize;
	int length;
}SeqList;
void InitList(SeqList &L){
	L.data=(int *)malloc(sizeof(int)*M);
	L.length=0;
	L.Maxsize=M;
	memset(L.data,0,sizeof(L.data));      //初始化顺序表     
}
void IncreaseSize(SeqList &L,int len){              //重新开辟一块连续的空间给顺序表 
	int *p=L.data;
	L.data=(int *)malloc(sizeof(int)*(len+L.Maxsize));
	for(int i=0;i<L.length;i++){                  //i这里最大到L.length而非Maxsize,因为可能分配的空间并没用全部用完,未使用的区域系统给的是随机值,存在脏数据 
												  //若想要写成Maxsize则可以在初始化顺序表时给每个数组初始化为统一的值。					        
		//将原本数据拷贝到新的区域下 
		L.data[i]=p[i];
	}
	L.Maxsize=L.length+len;          //更新最大size 
	free(p);      //记得释放结点 
}
bool ListInsert(SeqList &L,int i,int e){    //元素e插入到第i个位置  (以下代码统一i对应的是数组下标i-1,即i是位序) 
	//前两个if主要是考虑到健壮性 
	if(i<1 || i>L.length+1){       //L.length+1:这里是插入到最末尾,基于顺序表的结构最远也只能插入到L.length+1 
		return false;
	}
	if(L.length>=L.Maxsize){        //越界不能插入 
		return false;
	}
	for(int j=L.length;j>=i;j--){    //这里到i就停止因为下面是j-1 
		L.data[j]=L.data[j-1];
	}
	L.data[i-1]=e;
	L.length++;
	return true;
}
bool ListDelete(SeqList &L,int i,int &e){      //删除第i个元素,用e记录该值 
	if(i<1 || i>L.length+1){       
		return false;
	}
	e=L.data[i-1];
	for(int j=i;j<L.length;j++){
		L.data[j-1]=L.data[j];
	}
	L.length--;
	return true;
} 
int GetElem(SeqList &L,int i){               //按位查找    
	if(i<1 || i>L.length+1){         //越界       
		return error;
	}
	else{
		return L.data[i-1];
	}
} 
int LocateElem(SeqList &L,int e){               //按值查找 
	int i;
	for(int i=0;i<L.length;i++){
		if(L.data[i]==e){
			return i+1;
		}
	}
	return 0;      //查找失败 
}
bool ModifyElem(SeqList &L,int i,int e){                //第i个位置用元素e覆盖 
	if(i<1 || i>L.length+1){       
		return false;
	}		
	L.data[i-1]=e;
	return true;
}
int main(){
	SeqList L;
	InitList(L);
	int a;                            //测试用
	L.data[0]=50;             
	ListInsert(L,1,500);
	ListInsert(L,2,5000);
/*	printf("%d ",L.data[1]);
	ListDelete(L,1,a);	
	printf("%d %d",L.data[1],a);
	L.data[5]=2000;
	printf("%d",GetElem(L,2));
	printf("%d",LocateElem(L,5000));  
	ModifyElem(L,2,-9999);
	printf("%d",L.data[1]);
*/
	return 0;
} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值