数据结构 2024.7.31

1.按位置操作
1)按照位置插入数据
2)按照位置删除数据
3)按照位置修改数据
4)按照位置查找数据
2.按数据操作
1)按照数据查找数据
2)按照数据修改数据
3.删除顺序表和删除重复数据

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


#define N 100
//结构体
typedef struct
{
	int data[N];
	int pos;
}Sqe;

//创建顺序表
Sqe * create_sqtlist(void)
{
	Sqe *sq = (Sqe *)malloc(sizeof(Sqe));  
	if(sq == NULL)
		return NULL;    //malloc返回地址为空,代表没有申请成功堆空间

	sq -> pos = 0;     //将pos初始化为0

	return sq;
}

//插入数据

int insert_sqtlist(Sqe *sq,int num)
{
	//判读顺序表是否为满
	if(sq -> pos == N)
		return 0;

	//在pos位置插入数据
	sq -> data[sq -> pos] = num;

	//pos自增
	sq -> pos++;
	return 1;
}

//按指定位置插入数据
int ListInsert_SqList(Sqe *ptr,int loc,int num)
{
	//判断当前存储空间是否已满
	if(ptr -> pos == N)
		return 0;

	//判读插入位置是否合法
	if(loc > ptr ->pos || loc < 0)
		return 0;

	//插入新元素的步骤
	// 1.插入位置及之后的元素后移 
//	for(int i=0,j=(ptr->pos);i<ptr->pos-loc;i++,j--)
	for(int i=ptr->pos;i>loc;i--)
	{
//		ptr ->data[j] = ptr ->data[j-1];
		ptr ->data[i] = ptr ->data[i-1];
//
	}
	//2.将新元素放入第loc位置
	ptr ->data[loc] = num;

	//表长加1
	ptr ->pos++;  
	return 1;
}

//按指定位置修改数据
int chang_SqList(Sqe *ptr,int loc,int num)
{
	//判读插入位置是否合法
	if(loc > ptr ->pos || loc < 0)
		return 0;

	//将新元素放入第loc位置
	ptr ->data[loc] = num;

	return 1;
}

//删除数据
int del_sqtlist(Sqe *sq)
{

	//判读顺序表是否为空
	if(sq ->pos == 0)
		return 0;

	//将pos-1位置的数据置为0
//	sq -> data[sq -> pos-1] = 0;

	//更新pos
	sq->pos--;
	return 1;

}

//按位置删除
int delloc_sqtlist(Sqe *qtr,int index)
{
	//判断顺序表是否为空
	if(qtr ->pos == 0)
		return 0;
	//判断插入位置是否合法
	if(index >= qtr ->pos || index < 0)
		return 0;

	//将index位置后面的数据往前移动1位
	for(int i=index;i<qtr ->pos-1;i++)
		qtr ->data[i] = qtr ->data[i+1];

	//表长减1
	qtr ->pos--;
	return 1;
}

//删除重复数据
int deduplicate(Sqe *qtr)
{
	//判断顺序表是否为空或者只有一个数据是不用作删除
	if(qtr ->pos <=1)
		return 0;


	for(int i=0;i<qtr ->pos-1;i++)
	{
		for(int j=i+1;j <qtr ->pos;)
		{
			if(qtr ->data[i]==qtr ->data[j])
				delloc_sqtlist(qtr,j);
			else
			{
				j++;
			}
		}
	}
	return 1;
}

//删除顺序表
void dellist_sqtlist(Sqe **qtr)
{
	free(*qtr);
    *qtr = NULL;
}

//遍历顺序表
void traversal_sqtlist(Sqe * sq)
{
	//判断顺序表是否为空
	if(sq -> pos == 0)
		printf("顺序表为空");
	for(int i=0;i< sq->pos;i++)
		printf("%-3d",sq -> data[i]);
}


int main(int argc, const char *argv[])
{
	//通过函数创建一个顺序表
	Sqe *sq = create_sqtlist();

	//通过函数插入数据
	for(int i=0;i<10;i++)
		insert_sqtlist(sq,i);

	//通过函数遍历顺序表
	traversal_sqtlist(sq);
	putchar(10);

	//通过函数删除数据
	for(int i=0;i<5;i++)
		del_sqtlist(sq);

	//通过函数遍历顺序表
	traversal_sqtlist(sq);
	putchar(10);

	//在指定位置插入数据
	ListInsert_SqList(sq,0,1);
	ListInsert_SqList(sq,1,1);
	ListInsert_SqList(sq,2,1);
	ListInsert_SqList(sq,3,1);

	//在指定位置修改数据
	chang_SqList(sq,4,1);

	//通过函数遍历顺序表
	traversal_sqtlist(sq);
	putchar(10);

	//按位置删除
	delloc_sqtlist(sq,0);

	//通过函数遍历顺序表
	traversal_sqtlist(sq);
	putchar(10);

	//通过函数删除重复数据
	deduplicate(sq);

	//通过函数遍历顺序表
	traversal_sqtlist(sq);
	putchar(10);

	//删除顺序表
	dellist_sqtlist(&sq);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值