顺序表的基本操作
1.定义表
typedef struct{
int length;//当前长度
int MaxSize;//最大容量
int *data;//指示动态分配数组的指针
}Sqlist;
2.初始化
//初始化一个顺序表
void InitList(Sqlist &L){
//用malloc函数申请一片连续的空间
L.data=(int*)malloc(InitSize*sizeof(int *));
L.length=0; //长度为0
L.MaxSize=InitSize;
}
3.增加动态数组的长度
//增加动态数组的长度
void IncreaseSize(SeqList &L,int len){
int *p=L.data;//把顺序表的data指针的值赋给p,p指针的data指向同一个位置
L.data=(int *)malloc((L.MaxSize+len)*sizeof(int));
for(int i=0;i<L.length;i++){
L.data[i]=p[i]; //把数据复制到新区域
}
L.MaxSize=L.MaxSize+len;//顺序表的长度增加len
free(p); //释放原来的内存空间
}
3.插入数据
//插入操作
void ListInsert(Sqlist &L,int i,int e){
//在第i个位置插入元素e
for (int j=L.length;j>=i;j--){
L.data[j]=L.data[j-1]; //把i及i之后的元素都向后移动一位
}
L.data[i-1]=e; //把空出来的第i个位置插入e
L.length++; //表的长度+1
}
4.删除数据
void ListDelete(Sqlist &L,int i){
//删除L表中第i个元素
int x;
x=L.data[i-1]; //把要删除的元素值赋给x
for (int j=i;j<L.length;j++){
L.data[j-1]=L.data[j]; //第i个元素后面的元素前移
}
L.length--; //表的长度-1
printf("删除的元素是:%d",x);
printf("\n");
}
5.按值查找
我遇到问题了,,,,return之后printf就不输出了,然后去掉return就…
//按值查找
void GetElem(Sqlist L,int x){
int a;
for(int i=1;i<L.length;i++){
if (L.data[i-1]==x){ //如果第i个元素的值等于x,记住i
a=i; //如果只是查找所有数中的第一个x,怎么办 ,这个运行出来是最后一个x;
}
}
printf("这是第%d个元素:\n",a);
}
6.按位查找
顺序表随机存取
//按位查找
void LocateElem(Sqlist L,int i){
int e;
e=L.data[i-1]; //直接
printf("%d\n",e);
// printf("这是第%d个元素:",i);
}
7.更改元素
//更改元素
void AmendElem(Sqlist L,int i,int e){
L.data[i-1]=e;
}
8.完整代码
#include <stdio.h>
#include <stdlib.h>
#define InitSize 10
typedef struct{
int length;//当前长度
int MaxSize;//最大容量
int *data;//指示动态分配数组的指针
}Sqlist;
//初始化一个顺序表
void InitList(Sqlist &L){
//用malloc函数申请一片连续的空间
L.data=(int*)malloc(InitSize*sizeof(int *));
L.length=0; //长度为0
L.MaxSize=InitSize;
}
//展示
void display(Sqlist L){
printf("当前的数组为:");
for (int i=0;i<L.length;i++){
printf("%d",L.data[i]);
}
printf("\n");
}
//动态扩展空间
void IncreaseSize(Sqlist &L,int len){
int *p;
p=L.data;
L.data=(int *)malloc((L.MaxSize+len)*sizeof(int*));//注意是MaxSize,我最初误写成InitSize
for (int i=0;i<L.length;i++){
L.data[i]=p[i];
}
L.MaxSize=L.MaxSize+len;
free(p);
}
//插入操作
void ListInsert(Sqlist &L,int i,int e){
//在第i个位置插入元素e
for (int j=L.length;j>=i;j--){
L.data[j]=L.data[j-1];
}
L.data[i-1]=e;
L.length++;
}
//删除操作
void ListDelete(Sqlist &L,int i){
//删除L表中第i个元素
int x;
x=L.data[i-1];
for (int j=i;j<L.length;j++){
L.data[j-1]=L.data[j];
}
L.length--;
printf("删除的元素是:%d",x);
printf("\n");
}
//按值查找
void GetElem(Sqlist L,int x){
int a;
for(int i=1;i<L.length;i++){
if (L.data[i-1]==x){
a=i; //如果只是查找所有数中的第一个x,怎么办 ,这个运行出来是最后一个x;
}
}
printf("这是第%d个元素:\n",a);
}
//按位查找
void LocateElem(Sqlist L,int i){
int e;
e=L.data[i-1];
printf("%d\n",e);
// printf("这是第%d个元素:",i);
}
//更改元素
void AmendElem(Sqlist L,int i,int e){
L.data[i-1]=e;
}
int main(){
Sqlist L;
InitList(L);//初始化表
//添加数据
for(int i=1;i<L.MaxSize;i++){
L.data[i-1]=i;
L.length++;
}
display(L);
// 增加两个容量
IncreaseSize(L,2);
printf("当前最大容量:\n");
printf("%d",L.MaxSize);
printf("\n");
printf("在第二个位置插入元素7:\n");
ListInsert(L,2,7);
display(L);
printf("删除第四个元素:\n");
ListDelete(L,4);
display(L);
printf("查找数字1:");
GetElem(L,7);
printf("查找第3个元素:");
LocateElem(L,3);
printf("修改第6个元素为3:\n");
AmendElem(L,6,3);
display(L);
}