数据结构之动态顺序表

#include<stdio.h>
#include<stdlib.h>

#define initSize 10 //定义初始大小
#define ElemType int

typedef struct List{
int length,MaxSize;//现在定义的是动态的顺序表,所以设置一个MaxSize用来标识当前的数组有多大
ElemType *data;
}Node;

void create_list(Node *L)
{
L->data=(ElemType*)malloc(sizeof(ElemType)*initSize);
}

//初始化
void initList(Node* L)
{
printf("初始化前length的值=%d\n",L->length);
L->length=0;
L->MaxSize=initSize; //刚开始数组空间最大就是初始值大小,扩充才会变
printf("初始化后length的值=%d\n",L->length);
printf("初始化后MaxSize的值=%d\n",L->MaxSize);
}

//增加数组空间函数
void add_space(Node *L)
{
Node tmp;//定义一个结构体对象
//因为前面定义的是对象,不是指针,所以用. 而非 ->
//L->MaxSize+initSize是一个数字 sizeof(ElemType)*(L->MaxSize+initSize)这是算要多大空间
tmp.data=(ElemType*)malloc(sizeof(ElemType)*(L->MaxSize+initSize));
L->MaxSize=L->MaxSize+initSize;

for(int i=0;i<L->length;i++)
{
tmp.data[i]=L->data[i];
}
free(L->data);
L->data=tmp.data;
printf("空间不足,数组扩充成功\n");
}


//插入函数
void insertList(Node* L,ElemType a)
{
//先看看空间够不够,不够扩充
if(L->length==L->MaxSize)
{
add_space(L);
}
L->data[L->length]=a;
L->length++;
}

//显示函数
void print(Node *L)
{
for(int i=0;i<L->length;i++)
printf("%d ",L->data[i]);
printf("\n");
printf("插入后MaxSize的值=%d\n",L->MaxSize);
printf("插入后length的值=%d\n",L->length);


}

//查询函数
int locateElem(Node *L,ElemType target)
{
int tmp=-1;
for(int i=0;i<L->length;i++)
{
if(target==L->data[i])tmp=i;
}
if(tmp!=-1)
{
printf("存在\n");
return tmp;
}

else
{printf("不存在\n");
return -1;}
}

//根据下标插入数据
void zhen_insertList(Node *L,ElemType a,int index)
{
if(L->length<0)
{
printf("范围不正确\n");
return;
}
if(L->length==L->MaxSize)
{
add_space(L);
}

printf("当前表中元素数目%d \n",L->length);
for(int i=L->length;i>=index;i--)
{
//printf("当前i=%d \n",i);
L->data[i]=L->data[i-1];
}
L->data[index-1]=a;
L->length++;
printf("插入成功\n");
}

int main()
{
Node L;
create_list(&L);
initList(&L);

while(1){
int a;
printf("输入尾插的值\n");
scanf("%d",&a);
insertList(&L,a);

print(&L);
}

return 0;
}

 

动态顺序表
大体是定义一个喜欢的结构体,然后在结构体里把某一类别的的数据拿来存放数组的指针(这个类别也可以是结构体,套个娃),这样就完成链表的创建。
add_space(Node *L)
增加数组长度。将旧有数据转移到新的数组上
void initList(Node* L)
初始化也是将你喜欢的结构体里的属性length赋值为0,代表目前的静态表没数据储存
void insertList(Node* L,ElemType a)
插入函数就先判断一下你表是否满,就是看length属性的值有没有等于你规定的那个数组长度,可以把判别链表长度的写成一个函数。插入后length++
void print(Node *L)
显示函数,把数组的元素一个一个读出来
int locateElem(Node *L,ElemType target)
查询函数,传入链表指针和目标值,找到后返回目标的索引,找不到返回-1

void zhen_insertList(Node *L,ElemType a,int index)
你来定义插入位置的函数,传入的参数是链表指针,插入数据,插入的位置。先判断是否还有位置给你插入,表未满就可以插入。但是只能插入到有数据的位置

 

posted @ 2022-07-15 21:23  天天掉头发  阅读(54)  评论(0编辑  收藏  举报
返回顶端