#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;
}
顺序表C语言实现(增删改查实现)
最新推荐文章于 2024-07-25 02:49:15 发布