2023.03.29

作业一、顺序表按元素删除

                思路:参数【顺序表 删除的值key】

                1.根据删除的元素得到下标

                2.根据下标实现【按下标删除】

//头文件
//宏定义
#ifndef __HEAD_H__
#define __HEAD_H__

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

#define MAXSIZE 7  //表示线性表长度

typedef int datatype;//把int起别名为datatype
//定义顺序表:数据元素、顺序表长度
typedef struct
{
	//数据元素
	datatype data[MAXSIZE];
		
	//顺序表长度
	int len;
}seqlist;
seqlist *create();
int full_seqlist(seqlist *list);
int insert_rear(seqlist *list,datatype e);
void output(seqlist *list);
int empty_seqlist(seqlist *list);
int delete_rear(seqlist *list);
int search_sub(seqlist *list,int sub);
int update_sub(seqlist *list,int sub,datatype e;);
int insert_sub(seqlist *list,int sub,datatype e);
int delete_sub(seqlist *list,int sub);
int search_data(seqlist *list,int key);
int update_data(seqlist *list ,datatype key,datatype e);
int delete_data(seqlist *list,int key);
#endif

//主函数
#include "head.h"

int main(int argc, const char *argv[])
{
	seqlist *list=create();

	//循环在尾部插入
	int n;
	datatype e;
	printf("请输入数据元素的个数:");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		printf("请输入您要插入的值:");
		scanf("%d",&e);
		insert_rear(list ,e);

	}
	output(list);

	//删除
	delete_rear(list);
	delete_rear(list);
	output(list);

	//查找按下表
	int sub;
	printf("请输入你要查找的下表:");
	scanf("%d",&sub);
	search_sub(list ,sub);

	//修改
	printf("请输入要修改的下表:");
	scanf("%d",&sub);
	printf("请输入要修改的值");
	scanf("%d",&e);
	update_sub(list,sub,e);
	output(list);

	//插入
	printf("请输入要插入的下表:");
	scanf("%d",&sub);
	printf("请插入要修改的值");
	scanf("%d",&e);
	insert_sub(list,sub,e);
	output(list);

	//删除
	printf("请输入要删除的下表:");
	scanf("%d",&sub);
	delete_sub(list ,sub);
	output(list);
	
	//查找元素
	datatype key;
	printf("请输入你要查找的元素:");
	scanf("%d",&key);
	int flag=search_data(list, key);
	if(flag==-1)
		printf("查找失败\n");
	else
		printf("查找在%d个元素",flag);
	
	//按元素修改
	printf("请输入被修改的值:");
	scanf("%d",&key);
	printf("请输入要修改的值");
	scanf("%d",&e);
	update_data(list,key,e);
	output(list);
	
	//删除元素
	printf("请输入要删除的元素:");
	scanf("%d",&key);
	delete_data(list ,key);
	output(list);
	return 0;
}
//自定义函数

#include "head.h"
/*
 * function:    在堆区申请顺序表
 * @param [ in] 申请一个顺序表的空间
 * @param [out] 
 * @return      成功返回地址
 */
seqlist *create()
{
	seqlist *list=(seqlist *)malloc(sizeof(seqlist));
	if(list==NULL)
		return NULL;
	list->len=0;//把顺序表清空
	return list;
}

/*
 * function:    判断顺序表是否为满
 * @param [ in] 顺序表 
 * @param [out] 
 * @return      成功返回0,失败返回-1
 */
int full_seqlist(seqlist *list)
{
	return list->len==MAXSIZE?-1:0;
}

/*
 * function:   在尾部插入 
 * @param [ in] 顺序表 插入的值e
 * @param [out] 
 * @return      成功返回0,失败返回-1
 */
int insert_rear(seqlist *list,datatype e)
{

	//判断顺序表是否为满
	if (full_seqlist(list))//if(full_seqlist(list)==-1)
	{
		printf("顺序表已满!\n");
		return -1;
	}
	list ->data[list->len]=e;
	list ->len++;
	return 0;  
}

/*
 * function:    循环输出
 * @param [ in] 顺序表
 * @param [out] 
 * @return      无返回
 */

void output(seqlist *list)
{
	puts("");
	for(int i=0;i<list->len;i++)
	{
		printf("%d\t",list->data[i]);
	}
	puts("");
}

/*
 * function:    判断顺序表是否为空
 * @param [ in] 顺序表
 * @param [out] 
 * @return      成功返回0 失败返回-1
 */
int empty_seqlist(seqlist *list)
{
	return list ->len==0?-1:0;
}

/*
 * function:    顺序表尾删
 * @param [ in] 顺序表
 * @param [out] 
 * @return      成功返回0 失败返回-1
 */
int delete_rear(seqlist *list)
{
	//判断顺序表是否为空
	if(empty_seqlist(list))
	{
		printf("顺序表为空\n");
		return -1;
	}

	//尾删
	list->len--;
	return 0;
}

/*
 * function:    按下表查找
 * @param [ in] 顺序表 查找的下表
 * @param [out] 
 * @return      成功返回0 失败返回-1
 */
int search_sub(seqlist *list,int sub)
{
	//判断顺序表是否为空
	//判断下表是否合法
	if(empty_seqlist(list)||sub<0||sub>=list->len)
	{
		printf("顺序表查找失败\n");
		return -1;
	}

	//查找:输出
	printf("查找的元素是:%d\n",list->data[sub]);
		return 0;
}
/*
 * function:    按下表修改
 * @param [ in] 顺序表 修改的下表 修改的值
 * @param [out] 
 * @return      成功返回0, 失败返回-1
 */
int update_sub(seqlist *list,int sub,datatype e)
{
	//判断顺序表是否为空
	//判断下标是否合法
	if(empty_seqlist(list)||sub<0||sub>=list->len)
	{
		printf("修改失败\n");
		return -1;
	}
	//修改:重新赋值
	list->data[sub]=e;
	return 0;
	
}

/*
 * function:    按下表插入
 * @param [ in] 顺序表 插入的下表 插入的值
 * @param [out] 
 * @return      成功返回0 失败返回-1
 */

int insert_sub(seqlist *list,int sub,datatype e)
{
	//判断顺序表是否为满
	//判断下表是否合法
	if(full_seqlist(list)||sub<0||sub>list->len)
	{
		printf("插入失败\n");
		return -1;
	}
	//插入
	for(int i=list->len-1;i>=sub;i--)
	{
		list->data[i+1]=list->data[i];//后移
	}
	//在sub插入e
	list->data[sub]=e;
	list->len++;
	return 0;
}

/*
 * function:    按下表删除
 * @param [ in] 顺序表 删除的下表
 * @param [out] 
 * @return      成功返回0 失败返回-1
 */

int delete_sub(seqlist *list,int sub)
{
	//判断顺序表是否为空
	//判断下表是否合法
	
	if(empty_seqlist(list)||sub<0||sub>=list->len)
	{
		printf("删除失败\n");
		return -1;
	}
	//删除
	for(int i=sub+1;i<list->len;i++)
	{
		list->data[i-1]=list->data[i];//前移
	}
		list->len--;
}
	
/*
 * function:    按元素查找
 * @param [ in] 顺序表 查找的元素
 * @param [out] 
 * @return      成功返回下表 失败返回-1
 */

int search_data(seqlist *list,int key)
{
	for(int i=0;i<list->len;i++)
	{
		if(list->data[i]==key)
		{
			return i;
		}
	}
	return -1;
}

/*
 * function:    按元素修改
 * @param [ in] 顺序表 被修改的值 要修改的值
 * @param [out] 
 * @return      成功返回0 失败返回-1
 */
int update_data(seqlist *list ,datatype key,datatype e)
{
	//查找key的下表
	int sub =search_data(list,key);//sub是key的下表
	if (sub==-1)
	{
		printf("修改失败\n");
		return -1;
	}
	//调用按下表修改
	update_sub(list ,sub,e);
	return 0;
}



/*
 * function:    按元素删除
 * @param [ in] 顺序表 要被删除的元素
 * @param [out] 
 * @return      成功返回0 失败返回-1
 */
int delete_data(seqlist *list,int key)
{
	//查找key的下表
	int sub =search_data(list,key);//sub是key的下表
	if (sub==-1)
	{
		printf("删除失败\n");
		return -1;
	}
	//调用按下表删除
	delete_sub(list ,sub);
	return 0;
}

作业二、顺序表排序【类似数组排序】

                比较:if(list->data[j]  >  list->data[j+1])

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

#define MAX 100 //线性长度
typedef struct
{
	int *data;	//数据元素
	int len;	//顺序表长度
	int listsize;//最大容量
}seqlist;

//在堆区申请空间
seqlist *create()
{
	seqlist *list =(seqlist *)malloc(sizeof(seqlist));
	if(list==NULL)
		return NULL;
	list->len=0;//把顺序表清空
	return list;
}

//初始化新的顺序表
int new_seqlist(seqlist *list)
{
	list->data =(int *)malloc(MAX*sizeof(int));
	if(!list->data)
		exit(0);
	list->len=0;     //初始化长度为0
	list->listsize=MAX;//最大容量
	return 1;   //构造成功返回1

}

//手动输入生成顺序表
void crea_seqlist(seqlist *list)
{
	int i,n=0,s;
	printf("请输入所输字符串长度:\n");
	scanf("%d",&s);
	for(i=0;i<s;i++)
	{
		scanf("%d",&n);
		list->data[i]=n;
	}
	list->len=i;
	printf("输入成功!\n");//返回当前长度
}

//冒泡排序对输入表进行排序
void sequence(seqlist *list)
{
	for(int i=0;i<list->len;i++)
	{
		for(int j=0;j<list->len-i-1;j++)
		{
			if(list->data[j]> list->data[j+1])//生序排列
			{
				int temp =list->data[j];
				list->data[j]=list->data[j+1];
				list->data[j+1]=temp;
			}
		}
		for (int z=0;z<list->len;z++)
			printf("%d",list->data[z]);
		printf("\n");
	}
}

int main(int argc, const char *argv[])
{
	char ch;
	seqlist a,b,c;
	seqlist *list=create();
	if(new_seqlist(&a))
	{
		crea_seqlist(&a);
		sequence(&a);
		
	}



	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值