关于顺序表的增,删,改,查,以及如何连接两个表

创建一个表

//定义一个节点类型 假设为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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值