顺序表的使用,对数据的增删改查

主函数: 3.c

#include "3.h"//头文件调用
SqlListptr sql_cerate()//创建顺序表函数
{
	SqlListptr ptr=(SqlListptr)malloc(sizeof(SqlList));//在堆区申请连续的空间
	if(NULL==ptr)
	{
		printf("创建失败\n");
		return NULL;//如果没有申请成功,返回空,避免野指针
	}
	printf("创建成功\n");
	return ptr;//返回地址
	ptr->len=0;//len置为零
	bzero(ptr->date,sizeof(ptr->date));//对内容置零
}

int emtp(SqlListptr ptr)//判空
{
	if(NULL==ptr)
	{
		printf("判空失败\n");
		return -1;
	}
	return ptr->len==0;
}

int full(SqlListptr ptr)//判满
{
	if(NULL==ptr)
	{
		printf("判满失败\n");
		return -1;
	}
	return ptr->len==max;
}
int add(SqlListptr ptr,Date_Type  a)//增加
{
	if(NULL==ptr||full(ptr))
	{
		printf("增加失败\n");
		return 0;
	}
	ptr->date[ptr->len]=a;
	ptr->len++;
	return 1;

}
void show(SqlListptr ptr)//打印
{
	if(NULL==ptr||emtp(ptr))
	{
		printf("输出失败\n");
		return ;
	}
	for(int i=0;i<ptr->len;i++)
	{
		printf("%d ",ptr->date[i]);
	}
	putchar(10);
}
void  insert(SqlListptr ptr,int n,Date_Type a )//任意位置插入
{
	if(NULL==ptr||full(ptr)||n>ptr->len+1)
	{
		printf("插入失败\n");
		return ;
	}
	for(int i=0;i<ptr->len-n+1;i++)
	{
		ptr->date[ptr->len-i]=ptr->date[ptr->len-1-i];
	}

	ptr->date[n-1]=a;
		ptr->len++;
}
void anydel(SqlListptr ptr ,int n)//任意位置删除
{
	if(NULL==ptr||emtp(ptr)||n>ptr->len)
	{
		printf("删除失败\n");
		return;
	}
	for(int i=0;i<ptr->len-n;i++)
	{
		ptr->date[n-1+i]=ptr->date[n+i];
	}
	ptr->len--;
}

void change(SqlListptr ptr ,int n,Date_Type a)//任意修改
{

	if(NULL==ptr||emtp(ptr)||n>ptr->len)
	{
		printf("修改失败\n");
		return ;
	}
	ptr->date[n-1]=a;
}
void search(SqlListptr ptr,int n)//按位查找
{
	if(NULL==ptr||emtp(ptr)||n>ptr->len)
	{
		printf("查找失败\n");
		return;
	}
	printf("%d\n",ptr->date[n-1]);
}

int SearchValue(SqlListptr ptr,Date_Type n)//按值查找
{
	if(NULL==ptr||emtp(ptr))
	{
		return 0;
	}
	int flag=1;
	for(int i=0;i<ptr->len;i++)
	{
		if(n==ptr->date[i])
		{
			return i;
			flag=0;
		}
	}
	if(flag==0)
	{
		printf("没有该数据\n");
	}

}
void deduplicate(SqlListptr ptr)//去重
{
	if(NULL==ptr||ptr->len<2)
	{
		printf("去重失败\n");
	}
	for(int i=0;i<ptr->len;i++)
	{
		for(int j=i+1;j<ptr->len;j++)
		{
			if(ptr->date[i]==ptr->date[j])
			{
				anydel(ptr,j+1);
				j--;
			}
		}
	}
}
void myfree(SqlListptr *ptr)//销毁,释放内存
{
	if(NULL==ptr)
	{
		printf("销毁失败\n");
	}
	free(*ptr);
	printf("销毁成功\n");
	ptr=NULL;
}

头文件 3.h

#ifndef __3_h__//避免重复引用
#define __3_h__
#include<stdlib.h>//堆空间申请函数头文件
#include<string.h>
#include<stdio.h>//输入输出函数头文件
#define max 30//
typedef int Date_Type;//重定义

typedef struct sequence//重定义
{
	Date_Type date[max];
	int len;
}SqlList,*SqlListptr//重定义名
;
SqlListptr sql_cerate();//函数声明

int emtp(SqlListptr ptr);//判空

int full(SqlListptr ptr);//判满

int add(SqlListptr ptr,int a);//增加

void show(SqlListptr ptr);//打印

void insert(SqlListptr ptr,int n,Date_Type a);//任意插

void anydel(SqlListptr ptr ,int n);//任意删

void change(SqlListptr ptr,int n,Date_Type a);//按位置修改

void search(SqlListptr ptr,int n);//按位置查找

int  SearchValue(SqlListptr ptr,Date_Type n);//按数值查找

void deduplicate(SqlListptr ptr);//去重

void myfree(SqlListptr *ptr);//销毁,释放内存
#endif

测试函数main:4.c

include "3.h"//头文件引用
int main()
{
SqlListptr s=sql_cerate();//函数调用

	add(s,10);
	add(s,20);//一=依次尾插
	add(s,30);
	add(s,40);
	add(s,30);
	show(s);//打印
	int b=0;
	int flag=1;
	while(flag)
{
	printf("*************************************************************\n");
	printf("1,任意插入\t\t2.任意删除\t\t3.任意修改\n");
	printf("4.按下标查找\t\t5.按数值查找\t\t6.去重\n");
	printf("7.退出\t\t8.销毁文件\n");
	printf("**************************************************************\n");
	printf("请输入功能:\n");
	scanf("%d",&b);
switch(b)
	{
case 1:
		{	
		printf("请输入要在什么位置传值:");
		int n1=0;
		scanf("%d",&n1);
		insert(s,n1,60);//任意插
		show(s);//打印
		break;
		}
case 2:
		{
		printf("请输入要在什么位置删除:");
		int n2=0;
		scanf("%d",&n2);
		anydel(s,n2);//任意删
		show(s);//打印
		break;
		}
case 3:
		{
		printf("请输入要在什么位置修改:");
		int n3=0;
		scanf("%d",&n3);
		change(s,n3,66);
		show(s);
		break;
		}
case 4:
		{
		printf("请输入需要查哪一个:");
		int n4=0;
		scanf("%d",&n4);
		search(s,n4);
		break;
		}
case 5:
		{
		printf("请输入需要查哪一个:");
		int n5=0;
		int a;
		scanf("%d",&n5);
		a=SearchValue(s,n5);
		printf("该数据第为%d个数据\n",a);
		break;
		}
case 6:
		{
		deduplicate(s);//去重
		show(s);
		break;
		}
case 7:
		{
		flag=0;//置零,跳出循环
		}
	
case 8:
		{
			myfree(&s);//调用销毁函数,释放内存
			s=NULL;
		}
	}
	}
return 0;

}

运行截图:

相关推荐
努力d小白17 分钟前
leetcode230.二叉搜索树中第k小的元素
数据结构·算法
SoraLuna26 分钟前
「Mac玩转仓颉内测版52」基础篇14 - 递归函数与尾递归优化
开发语言·算法·macos·华为·cangjie
shinelord明36 分钟前
【再谈设计模式】组合模式~层次构建的多面手
数据结构·算法·设计模式·软件工程
di.D1 小时前
判断闰年---算法
数据结构·算法·c#
羽墨灵丘1 小时前
排序算法(6):快速排序
算法·排序算法
Yolo566Q1 小时前
LEAP模型的能源环境发展、碳排放建模预测及不确定性分析实践应用
人工智能·算法
7yewh1 小时前
LeetCode 力扣 热题 100道(十九)最长连续序列(C++)
c语言·数据结构·c++·算法·leetcode·嵌入式
奔跑的废柴1 小时前
LeetCode 718. 最长重复子数组 java题解
java·算法·leetcode
loop lee1 小时前
Redis - 实战之 全局 ID 生成器 RedisIdWorker
java·redis·算法·缓存
银氨溶液1 小时前
力扣.——560. 和为 K 的子数组
数据结构·c++·算法·leetcode·前缀和·职场和发展