静态顺序表和动态顺序表
首先让我们了解一下这两种顺序表有什么区别
所以我们可以知道如果想要插入和删除顺序表中元素时,我们需要用到动态顺序表
还需要了解一下C语言动态内存分配
顺序表:
插入时,记得申请开拓空间
删除时,记得用后面的数据覆盖前面的数据
初始化顺序表
void list_initial(List *L) //初始化顺序表
{
L->list = (int *)malloc(MAXSIZE * sizeof(int)); //开辟10个int大小的空间并且强制转化成指针
if(L->list == NULL)
{
printf("内存开辟失败\n");
exit(0); //正常退出
}
L->len = 0; //初始化数据有效数据为0
L->listsize = MAXSIZE; //初始化数组长度为MAXSIZE
printf("内存开辟成功\n");
}
输出顺序表
void show_list(List *L) //2、输出该顺序表
{
printf("\n");
for(int i=0;i<L->len;i++)
{
printf("%d\t",L->list[i]);
}
printf("\n");
}
在顺序表中插入数据
void list_insert(List *L,int i, int data)
{
int *base, *insert, *p;
if(i<1 || i>L->len+1 || L==NULL) //这里检查插入的位置有没有问题
{
printf("位置输入错误\n");
printf("失败");
}
if(L->len > L->listsize)
{
base = (int *)realloc(L->list,(L->listsize+MAXSIZE)*sizeof(int)); //这里想想是不是可以用 L->len+1(有效数据个数)来申请拓展空间就可以了
L->list = base;
L->listsize = L->listsize + MAXSIZE; //这里想想是不是可以用 L->len+1(有效数据个数)来申请拓展空间就可以了 ,因为这样可能申请冗余
// printf("list->list:%d\n",L->list); //这里在测试的时候应该注意这里不是指针类型
// printf("list->len:%d\n",L->len);
// printf("list->listsize:%d\n",L->listsize);
}
insert = &(L->list[i-1]); //插入的位置
for(p=L->list + L->len-1; p>=insert; p--)
{
*(p+1) = *p;
}
*insert = data; //直接传递数值
L->len++; //每有数值进来时,有效长度+1
printf("插入成功");
}
在顺序表中删除数据
void list_delete(List *L,int i)
{
int *q, *delete_i;
if(L==NULL || i<0 || i>L->len)
{
printf("位置输入错误\n");
printf("失败");
}
delete_i = &(L->list[i-1]); //指针指向需要删除的位置
q = L->list + L->len-1; //指针指向最后位置
for(delete_i=delete_i+1; delete_i<=q; ++delete_i)
{
*(delete_i-1) = *delete_i;
}
L->len--;
printf("删除成功");
}
完整代码
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10 //这里先自己假定有10个位置
typedef struct
{
int *list; //这里需要特别注意,还没有分配大小,如果没有分配大小在后面的输入输出会失败
int len; //有效数据
int listsize; //顺序表的长度
}List;
void list_initial(List *L) //初始化顺序表
{
L->list = (int *)malloc(MAXSIZE * sizeof(int));
if(L->list == NULL)
{
printf("内存开辟失败\n");
exit(0); //正常退出
}
L->len = 0; //初始化数据有效数据为0
L->listsize = MAXSIZE; //初始化数组长度为MAXSIZE
printf("内存开辟成功\n");
}
void list_insert(List *L,int i, int data)
{
int *base, *insert, *p;
if(i<1 || i>L->len+1 || L==NULL) //这里检查插入的位置有没有问题
{
printf("位置输入错误\n");
printf("失败");
}
if(L->len > L->listsize)
{
base = (int *)realloc(L->list,(L->listsize+MAXSIZE)*sizeof(int)); //这里想想是不是可以用 L->len+1(有效数据个数)来申请拓展空间就可以了
L->list = base;
L->listsize = L->listsize + MAXSIZE; //这里想想是不是可以用 L->len+1(有效数据个数)来申请拓展空间就可以了 ,因为这样可能申请冗余
// printf("list->list:%d\n",L->list); //这里在测试的时候应该注意这里不是指针类型
// printf("list->len:%d\n",L->len);
// printf("list->listsize:%d\n",L->listsize);
}
insert = &(L->list[i-1]); //插入的位置
for(p=L->list + L->len-1; p>=insert; p--)
{
*(p+1) = *p;
}
*insert = data; //直接传递数值
L->len++; //每有数值进来时,有效长度+1
printf("插入成功");
}
void list_delete(List *L,int i)
{
int *q, *delete_i;
if(L==NULL || i<0 || i>L->len)
{
printf("位置输入错误\n");
printf("失败");
}
delete_i = &(L->list[i-1]); //指针指向需要删除的位置
q = L->list + L->len-1; //指针指向最后位置
for(delete_i=delete_i+1; delete_i<=q; ++delete_i) //删除的时候记得+1
{
*(delete_i-1) = *delete_i;
}
L->len--;
printf("删除成功");
}
void show_list(List *L) //2、输出该顺序表
{
printf("\n");
for(int i=0;i<L->len;i++)
{
printf("%d\t",L->list[i]);
}
printf("\n");
}
int main()
{
int i;
List L; //直接定义一个指针变量,待会看看可不可以把星号去掉 ,去不掉!!!换方法
list_initial(&L);
for(i=0; i<10; i++)
{
list_insert(&L,i+1,i+1);
}
printf("\n");
printf("插入前的顺序表");
show_list(&L);
// printf("list->list:%d\n",L.list); //这里在测试的时候应该注意这里不是指针类型
// printf("list->len:%d\n",L.len);
// printf("list->listsize:%d\n",L.listsize);
list_insert(&L,2,0);
show_list(&L);
list_delete(&L,2);
show_list(&L);
return 0;
}