//动态顺序表
//引用库函数
#include <stdio.h>
#include <stdlib.h>
//宏定义
#define List_init_size 4
#define List_add_size 2
#define OVERFLOW -2
typedef int Elemtype; // Elemtype元素类型
//定义结构体
typedef struct{
Elemtype *elem; //存储空间首地址(基址)
int length;
int Listsize; //当前分配的存储容量
}SqList; //结构体名
//函数声明
void InitList(SqList *l); //构造一个空的顺序表
void ListInsert(SqList *l,int i,int a); //顺序表的增加元素
void ListDelete(SqList *l,int i); //顺序表的删除元素
void ListPrintf(SqList *l);
#include <stdio.h>
int main()
{
SqList l;
InitList(&l);
ListInsert(&l,1,15);
ListInsert(&l,1,16);
ListInsert(&l,1,20);
ListInsert(&l,1,30);
ListInsert(&l,2,45);
ListPrintf(&l);
ListDelete(&l,1);
ListPrintf(&l);
return 0;
}
void ListPrintf(SqList *l)
{
printf("打印出list如下:\n");
for(int i=0;i<l->length;i++)
{
printf("%d ",l->elem[i]);
}
printf("list长度为:%d\n",l->length);
}
//构造一个空的顺序表
void InitList(SqList *l)
{
l->elem =(Elemtype *)malloc(List_init_size*sizeof(Elemtype));
if(!l->elem)exit (OVERFLOW); //存储分配失败
l->length =0;
l->Listsize =List_init_size;
}
//顺序表的增加元素
void ListInsert(SqList *l,int i,int a)
{
//这里插入的位置i 意思为插在 i 之前的一个位置
if(i<1 || i>l->length+1) printf("你要插入的位置不合法!.....插入失败!\n");
else{
if(l->length >= l->Listsize)
{
printf("到这里增加了存储空间!");
Elemtype *newbase;//分配一个临时基址
newbase=(Elemtype *)realloc(l->elem,(List_init_size+List_add_size)*sizeof(Elemtype));
if(!newbase) exit(OVERFLOW);
l->elem=newbase;
l->Listsize += List_add_size;
}
if(l->length!=0)
{
for(int j=l->length-1;j>=i-1;j--) //第I个元素及之后的元素后移一位(从数组尾部开始移)
{
l->elem[j+1] =l->elem[j];
}
}
l->elem[i-1]=a;
l->length++;
printf("");
ListPrintf(l);
}
}
//顺序表的删除元素
void ListDelete(SqList *l,int i)
{
if(l->length == 0) printf("空表,没有元素可以删除!\n");
else if(i<0|| i>=l->length) printf("你要删除的位置不合法!.....删除失败!\n");
else{
for(int j=i;j<l->length;j++)
{
l->elem[j]=l->elem[j+1];
}
l->length--;
}
}
动态顺序表
最新推荐文章于 2022-03-09 15:29:34 发布