【Day3】数据结构顺序表

在这里插入图片描述
main.c:

#include "head.h"
int main(int argc, const char *argv[])
{
	int n,e;
	//创建顺序表
	seqlist *l = create();
	printf("请输入你要插入的数据个数:");
	scanf("%d",&n);
	for(int i = 0;i<n;i++){
		printf("请输入你要插入的数据:");
		scanf("%d",&e);
		//顺序表的尾插
		insert_rear(e,l);
	}
	//输出
	output(l);
	//顺序表的尾删
	delete_rear(l);
	output(l);
	//顺序表的判满
	int len = full(l);
	if(len==1)
		printf("顺序表已满\n");
	else if(len==0)
		printf("顺序表未满\n");

	len = empty(l);
	if(len==1)
		printf("顺序表为空\n");
	else if(len==0)
		printf("顺序表不为空\n");	
	//顺序表按下标插入
	printf("请输入插入位置:");
	scanf("%d",&n);
	printf("请输入插入元素:");
	scanf("%d",&e);
	insert_sub(l,n,e);
	output(l);
	printf("请输入删除元素位置:");
	scanf("%d",&n);
	//顺序表按下标删除
	delete_sub(l,n);
	output(l);
	//顺序表按下标修改	
	printf("请输入修改位置:");
	scanf("%d",&n);
	printf("请输入修改元素:");
	scanf("%d",&e);
	update_sub(l,n,e);
	output(l);
	//顺序表按下标查找
	printf("请输入查找位置:");
	scanf("%d",&n);
	n = find_sub(l,n);
	printf("该位置元素为:%d\n",n);
	//顺序表按元素插入
	printf("请输入查找元素:");
	scanf("%d",&n);
	printf("请输入插入元素:");
	scanf("%d",&e);
	insert_data(l,n,e);
	output(l);
	//顺序表按元素删除
	printf("请输入删除元素:");
	scanf("%d",&n);
	delete_data(l,n);
	//顺序表按元素修改
	printf("请输入修改元素:");
	scanf("%d",&n);
	printf("请输入修改值:");
	scanf("%d",&e);
	update_data(l,n,e);
	//冒泡升序
	bubble(l);
	output(l);
	//顺序表去重
	delete_re(l);
	l = free_space(l);
	l = NULL;
	return 0;
}

test.c:


#include "head.h"
/*
 * function:    顺序表堆空间的创建
 * @param [ in] 
 * @param [out] 
 * @return      失败返回NULL,成功返回顺序表指针
 */
seqlist *create()
{
	seqlist *list = (seqlist *)malloc(sizeof(struct Seq));
	//判断是否创建成功
	if(list==NULL)
		return NULL;
	//初始化顺序表
	list->len = 0;
	return list;
}
/*
 * function:    顺序表的尾部插入
 * @param [ in] 待插数据 顺序表
 * @param [out] 
 * @return      无
 */
void insert_rear(datatype e,seqlist *l)
{
	//判断创建成功或顺序表满
	if(l->len==MAXSIZE||l==NULL){
		printf("插入失败\n");
		return ;
	}
	//插入
	l->data[l->len] = e;
	l->len++;
}
/*
 * function:    顺序表的遍历
 * @param [ in] 顺序表
 * @param [out] 
 * @return      无
 */
void output(seqlist *l)
{
	//判断创建成功或顺序表空
	if(l==NULL||l->len==0){
		puts("顺序表为空\n");
		return ;
	}
	//循环遍历
	for(int i = 0;i<l->len;i++){
		printf("%d\t",l->data[i]);
	}
	puts(" ");
}
/*
 * function:    顺序表的尾部删除
 * @param [ in] 顺序表
 * @param [out] 
 * @return      无
 */
void delete_rear(seqlist *l)
{
	//判断创建成功或顺序表空
	if(l==NULL||l->len==0){
		printf("删除失败\n");
		return ;
	}
	//删除
	printf("被删除的元素是:%d\n",l->data[l->len]);
	l->len--;
}
/*
 * function:    顺序表的判满
 * @param [ in] 顺序表
 * @param [out] 
 * @return      满返回1,不满返回0
 */
int full(seqlist *l){
	return l->len==MAXSIZE?1:0;
}
/*
 * function:    顺序表的判空
 * @param [ in] 顺序表
 * @param [out] 
 * @return      空返回1,不空返回0
 */
int empty(seqlist *l){
	return l->len==0?1:0;
}
/*
 * function:    顺序表的按下标插入
 * @param [ in] 顺序表 位置 插入元素
 * @param [out] 
 * @return      无
 */
void insert_sub(seqlist *l,int sub,datatype e)
{
	//判断创建成功或顺序表满
	//判断下标是否合法
	if(l==NULL||l->len==MAXSIZE||sub<0||sub>MAXSIZE){
		printf("插入失败\n");
		return ;
	}
	//插入
	//循环后移
	for(int i = l->len-1;i>=sub;i--){
		l->data[i+1] = l->data[i];//后移
	}
	//插入
	l->data[sub]=e;
	l->len++;
}
/*
 * function:    顺序表按下标删除
 * @param [ in] 顺序表 删除位置
 * @param [out] 
 * @return      无
 */
void delete_sub(seqlist *l,int sub)
{
	//判断创建成功或顺序表空
	//判断下标是否合法
	if(l==NULL||l->len==0||sub<0||sub>MAXSIZE){
		printf("删除失败\n");
		return ;
	}
	//删除
	//循环前移
	for(int i = sub+1;i<l->len;i++){
		l->data[i-1]=l->data[i];//前移
	}
	l->len--;
}
/*
 * function:    顺序表按下标修改
 * @param [ in] 顺序表 修改位置 修改元素
 * @param [out] 
 * @return      无
 */
void update_sub(seqlist *l,int sub,datatype e)
{
	//判断创建成功或顺序表空
	//判断下标是否合法
	if(l==NULL||l->len==0||sub<0||sub>l->len){
		printf("修改失败\n");
		return ;
	}
	//修改
	l->data[sub]=e;
}
/*
 * function:    按下标查找
 * @param [ in] 顺序表 位置
 * @param [out] 
 * @return      成功返回该下标对应的值,失败返回-1
 */
int find_sub(seqlist *l,int sub)
{
	//判断创建成功或顺序表空
	//判断下标是否合法
	if(l==NULL||l->len==0||sub<0||sub>l->len){
		printf("查找失败\n");
		return -1;
	}
	return l->data[sub];
}
/*
 * function:    按元素查找
 * @param [ in] 顺序表 查找元素
 * @param [out] 
 * @return     存在返回下标 不存在返回-1 
 */
int find_data(seqlist *l,datatype key)
{
	//判断创建成功或顺序表空
	if(l==NULL||l->len==0)
		return -1;
	for(int i =0;i<l->len;i++){
		if(l->data[i]==key)
			return i;
	}
	return -1;
}
/*
 * function:    顺序表按元素插入
 * @param [ in] 顺序表 查找元素 插入元素
 * @param [out] 
 * @return      成功返回0,失败返回-1
 */
int insert_data(seqlist *l,datatype key,datatype e)
{
	int sub=-1;
	//根据key查下标
	for(int i = 0;i<l->len;i++){
		if(l->data[i]==key){
			sub = i;
			break;
		}
	}
	if(sub==-1){
		printf("查找失败\n");
		return -1;
	}
	insert_sub(l,sub,e);
	return 0;
}
/*
 * function:    顺序表按元素删除
 * @param [ in] 顺序表 元素值key
 * @param [out] 
 * @return      成功返回0,失败返回-1
 */
int delete_data(seqlist *l,datatype key)
{
	int sub = find_data(l,key);
	if(sub==-1)
		return -1;
	//根据下标删除
	delete_sub(l,sub);
	return 0;
}
/*
 * function:    顺序表按元素修改
 * @param [ in] 顺序表 查找值key 修改值e
 * @param [out] 
 * @return      成功返回0,失败返回-1
 */
int update_data(seqlist *l,datatype key,datatype e)
{
	int sub = find_data(l,key);
	if(sub==-1)
		return -1;
	update_sub(l,sub,e);
	return 0;
}
/*
 * function:    冒泡升序
 * @param [ in] 顺序表
 * @param [out] 
 * @return      无
 */
void bubble(seqlist *l)
{
	//判断创建成功或顺序表空
	if(l==NULL||l->len==0)
		return ;
	for(int i = 1;i<l->len;i++){
		int count = 0;
		for(int j = 0;i<l->len-i;j++){
			if(l->data[j]>l->data[j+1]){
				datatype t = l->data[j];
				l->data[j] = l->data[j+1];
				l->data[j+1] = t;
				count++;
			}
		}
		if(count==0)
			break;
	}
}
void select_sort(seqlist *list)
{
    //2 4 6 3 7 1
    //1,判断顺序表创建是否成功
    //2,判断顺序表是否空
    if(list==NULL || list->len==0)
    {
        printf("排序失败\n");

    }
    //3,简单选择排序
    for(int i=0;i<list->len-1;i++)//轮数
    {
        int min=i;//默认第一个下表是最值下表
        for(int j=i+1;j<list->len;j++)
        {
            if(list->data[min] > list->data[j])
            {
                min=j;
            }
        }
        if(min!=i)
        {
            datatype t=list->data[min];
            list->data[min]=list->data[i];
            list->data[i]=t;

        }
    }
}
void delete_re(seqlist *list)
{
	 for(int i=0;i<list->len-1;i++)
    {
        for(int j=i+1;j<list->len;j++)
        { 
            if(list->data[i]==list->data[j])
            {
                 delete_sub(list,j);  
                 j--;  //防止连续的且重复元素漏删       
            }                    
        }
    }
}
seqlist *free_space(seqlist *l)
{
	//删掉所有元素
	l->len=0;
	free(l);
	l = NULL;
	return l;
}

head.h

#ifndef Head_H
#define Head_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 10
typedef int datatype;
//顺序表结构体的定义
typedef struct Seq
{
	//数据元素
	datatype data[MAXSIZE];
	//顺序表长度
	int len;
}seqlist;
void output(seqlist *l);
void insert_rear(datatype e,seqlist *l);
seqlist *create();
void delete_rear(seqlist *l);
int full(seqlist *l);
int empty(seqlist *l);
void insert_sub(seqlist *l,int sub,datatype e);
void delete_sub(seqlist *l,int sub);
void update_sub(seqlist *l,int sub,datatype e);
int insert_data(seqlist *l,datatype key,datatype e);
int find_sub(seqlist *l,int sub);
int find_data(seqlist *l,datatype key);
int update_data(seqlist *l,datatype key,datatype e);
int delete_data(seqlist *l,datatype key);
void bubble(seqlist *l);
void select_sort(seqlist *list);
seqlist *free_space(seqlist *l);
void delete_re(seqlist *list);
#endif

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值