创建一个表
//定义一个节点类型 假设为int
typedef int Data_t;
//定义一个顺序表
struct list_t
{
int max_len;
int cnt;
Data_t *data;
};
//定义对顺序表的操作
//创建表
int create_list(struct list_t *head,int max_len)
{
//入参检查
if(head==NULL||head<=0)
return -1;//返回错误码
//填充参数
head->max_len=max_len;
head->cnt=0;
//申请空间
head->data=(Data_t *)malloc(max_len * sizeof(Data_t ));
//若申请空间失败
if(head->data==NULL)
{
printf("malloc err!");
return -2;
}
return 0;
}
删除数据
int del_list(struct list_t *head)
{
if(head==NULL) return -1;
if(head->data)
free(head->data);
head->data=NULL;
head->max_len=0;
head->cnt=0;
return 0;
}
删除节点
int del_Data_t(struct list_t *head)
{
if(head==NULL || head->data==NULL) return -1;
if(head->data)
return 0;
}
插入数据
int insert_list(struct list_t*head,int index,Data_t data)
{
if(head==NULL || head->data==NULL) return -1;
//判断位置能否插入
if(index > head->cnt)
{
printf("表格已满!\n");
return -3;
}
//移开位置
//找到最后一个元素下标 int i = head->cnt - 1
for (int i=head->cnt-1;i>=index;i--)
{
head->data[i+1]=head->data[i];
}
//写入数据
head->data[index]=data;
head->cnt ++;//更新元素个数
return 0;
}
已知值,查找元素下标
int get_list_index(struct list_t *head,int *index,Data_t data)
{
if(head==NULL || head->data==NULL) return -1;
for(int i=0;i<head->cnt;i++)
{//找值相同的下标
if(head->data[i]==data)
{
*index=i;
return 0;
}
}
}
已知元素下标 找值
int get_list_data(struct list_t *head,int index,Data_t *data)
{
if(head==NULL || head->data==NULL) return -1;
//下标不存在
if(index>=head->cnt)
{
printf("%d号元素不存在!\n",index);
return -1;
}
*data=head->data[index];
return 0;
}
判空判满
//判断列表是否为空
//返回值 <0 err ==0 空的 >0 表中存放的数据个数
int list_isblank(struct list_t *head)
{
if(head==NULL || head->data==NULL) return -1;
return head->cnt;
}
//判断列表是满否
int list_isfull(struct list_t *head)
{
if(head==NULL || head->data==NULL) return -1;
return head->max_len - head->cnt;
}
获得长度
int len(struct list_t *head)
{
return head->cnt;
}
合并两个表
int connect_list(struct list_t *L1,struct list_t *L2)
{
if(L1==NULL || L2==NULL || L1->data==NULL || L2->data==NULL) return -1;
if(L1->max_len - L1->cnt < L2->cnt)
{
printf("L1长度不足!\n");
return -2;
}
//复制L2中所有节点到L1中
for(int i;i<L2->cnt;i++)
L1->data[L1->cnt+i]=L2->data[i];
L1->cnt+=L2->cnt;
}
主函数
int main()
{
//使用表结构创建一个表
struct list_t L;
//要求创建一个有25 个空间的顺序表
int ret=create_list(&L,25);
if(ret==0)
{
printf("表L创建成功!");
printf("data=%p\n",L.data);
}
insert_list(&L,0,10);
insert_list(&L,1,20);
insert_list(&L,2,30);
insert_list(&L,3,40);
show_list(&L);
// 获得表中的一个元素
Data_t dt;
int index;
//已知值,查找下标
if(get_list_index(&L,&index,30)==0)
{
printf("元素值为30的下标是%d\n",index);
}
//已知下标,查找值
if(get_list_data(&L,2,&dt)==0)
{
printf("3号元素的值为%d\n",dt);
}
/*
//删除表
del_list(&L);
show_list(&L);
// 删除节点
del_Data_t(&L);
show_list(&L);
*/
//判断空否
list_isblank(&L);
//判断满否
list_isfull(&L);
//获得长度
len(&L);
//创建表S
//使用表结构创建一个表
struct list_t S;
//要求创建一个有25 个空间的顺序表
int ret2=create_list(&S,25);
if(ret2==0)
{
printf("表S创建成功!");
printf("data=%p\n",S.data);
}
insert_list(&S,0,10);
insert_list(&S,0,15);
insert_list(&S,0,20);
insert_list(&S,0,25);
show_list(&S);
//连接两个表
//新创建一个表M
struct list_t M;
int ret3=creat_list(&M,25)
if(ret3==0)
{
printf("表M创建成功!");
}
connect_list(&M,&L,&S);
return 0;
}
总共的代码
#include<stdio.h>
#include<stdlib.h>
//定义一个节点类型 假设为int
typedef int Data_t;
//定义一个顺序表
struct list_t
{
int max_len;
int cnt;
Data_t *data;
};
//定义对顺序表的操作
//创建表
int create_list(struct list_t *head,int max_len)
{
//入参检查
if(head==NULL||head<=0)
return -1;//返回错误码
//填充参数
head->max_len=max_len;
head->cnt=0;
//申请空间
head->data=(Data_t *)malloc(max_len * sizeof(Data_t ));
//若申请空间失败
if(head->data==NULL)
{
printf("malloc err!");
return -2;
}
return 0;
}
//删除表
int del_list(struct list_t *head)
{
if(head==NULL) return -1;
if(head->data)
free(head->data);
head->data=NULL;
head->max_len=0;
head->cnt=0;
return 0;
}
//插入数据
int insert_list(struct list_t*head,int index,Data_t data)
{
if(head==NULL || head->data==NULL) return -1;
//判断位置能否插入
if(index > head->cnt)
{
printf("表格已满!\n");
return -3;
}
//移开位置
//找到最后一个元素下标 int i = head->cnt - 1
for (int i=head->cnt-1;i>=index;i--)
{
head->data[i+1]=head->data[i];
}
//写入数据
head->data[index]=data;
head->cnt ++;//更新元素个数
return 0;
}
//删除节点
int del_Data_t(struct list_t *head)
{
if(head==NULL || head->data==NULL) return -1;
if(head->data)
return 0;
}
//已知值,查找元素下标
int get_list_index(struct list_t *head,int *index,Data_t data)
{
if(head==NULL || head->data==NULL) return -1;
for(int i=0;i<head->cnt;i++)
{//找值相同的下标
if(head->data[i]==data)
{
*index=i;
return 0;
}
}
}
//已知元素下标 找值
int get_list_data(struct list_t *head,int index,Data_t *data)
{
if(head==NULL || head->data==NULL) return -1;
//下标不存在
if(index>=head->cnt)
{
printf("%d号元素不存在!\n",index);
return -1;
}
*data=head->data[index];
return 0;
}
//判断列表是否为空
//返回值 <0 err ==0 空的 >0 表中存放的数据个数
int list_isblank(struct list_t *head)
{
if(head==NULL || head->data==NULL) return -1;
return head->cnt;
}
//判断列表是满否
int list_isfull(struct list_t *head)
{
if(head==NULL || head->data==NULL) return -1;
return head->max_len - head->cnt;
}
int show_list(struct list_t *head)
{
if(head==NULL || head->data==NULL) return -1;
for(int i=0;i < head->cnt;i++)
printf("%d ",head->data[i]);
printf("\n");
return 0;
}
//获得长度
int len(struct list_t *head)
{
return head->cnt;
}
//合并两个表
int connect_list(struct list_t *L1,struct list_t *L2)
{
if(L1==NULL || L2==NULL || L1->data==NULL || L2->data==NULL) return -1;
if(L1->max_len - L1->cnt < L2->cnt)
{
printf("L1长度不足!\n");
return -2;
}
//复制L2中所有节点到L1中
for(int i;i<L2->cnt;i++)
L1->data[L1->cnt+i]=L2->data[i];
L1->cnt+=L2->cnt;
}
int main()
{
//使用表结构创建一个表
struct list_t L;
//要求创建一个有25 个空间的顺序表
int ret=create_list(&L,25);
if(ret==0)
{
printf("表L创建成功!");
printf("data=%p\n",L.data);
}
insert_list(&L,0,10);
insert_list(&L,1,20);
insert_list(&L,2,30);
insert_list(&L,3,40);
show_list(&L);
// 获得表中的一个元素
Data_t dt;
int index;
//已知值,查找下标
if(get_list_index(&L,&index,30)==0)
{
printf("元素值为30的下标是%d\n",index);
}
//已知下标,查找值
if(get_list_data(&L,2,&dt)==0)
{
printf("3号元素的值为%d\n",dt);
}
/*
//删除表
del_list(&L);
show_list(&L);
// 删除节点
del_Data_t(&L);
show_list(&L);
*/
//判断空否
list_isblank(&L);
//判断满否
list_isfull(&L);
//获得长度
len(&L);
//创建表S
//使用表结构创建一个表
struct list_t S;
//要求创建一个有25 个空间的顺序表
int ret2=create_list(&S,25);
if(ret2==0)
{
printf("表S创建成功!");
printf("data=%p\n",S.data);
}
insert_list(&S,0,10);
insert_list(&S,0,15);
insert_list(&S,0,20);
insert_list(&S,0,25);
show_list(&S);
//连接两个表
//新创建一个表M
struct list_t M;
int ret3=creat_list(&M,25)
if(ret3==0)
{
printf("表M创建成功!");
}
connect_list(&M,&L,&S);
return 0;
}