2024.11.28(作业)

发布于:2024-11-29 ⋅ 阅读:(51) ⋅ 点赞:(0)

思维导图

功能函数声明文件

#ifndef _FUN_H__
#define _FUN_H__
#include <myhead.h>

#define MAX 50 		//数组大小
#define QAZ 20      //长度和字符串大小

typedef int datatype; //数据元素类型

//2.1  定义顺序表类型
typedef struct
{
	datatype data[MAX];
	int len;
}SeqList,*SeqList_ptr;

//2.2  创建顺序表
SeqList_ptr list_create();

//2.3  判断顺序表是否为空
int list_empty(SeqList_ptr S);

//2.4  判断顺序表是否满了
int list_full(SeqList_ptr S);

//2.5  向顺序表中添加元素
int list_add(SeqList_ptr S,datatype e);

//2.6  查看顺序表内容函数
void list_show(SeqList_ptr S);

//2.7  顺序表按任意位置进行插入操作
int list_insert_pos(SeqList_ptr S,int pos,datatype e);
 
//2.8  顺序表按位置进行删除
int list_delete_pos(SeqList_ptr S,int pos);

//2.9  顺序表按值查找
int list_search_value(SeqList_ptr S,datatype e);

//2.10 顺序表按位置查找返回元素值
int List_search_position(SeqList_ptr S,int pos);

//2.11 顺序表按位置进行修改元素
int list_update_position(SeqList_ptr S,int pos,datatype e);

//2.12 顺序表按值进行修改
int list_update_value(SeqList_ptr S,datatype old_e,datatype new_e);

//2.13 顺序表排序
int list_sort(SeqList_ptr S);

//2.14 顺序表去重操作
int list_unique(SeqList_ptr S);

//2.15 顺序表翻转
int list_flip(SeqList_ptr S);

//2.16 获取顺序表的长度
int list_long(SeqList_ptr S);

//2.17 清空数组
int list_clear(SeqList_ptr S);

//2.18 销毁顺序表
int list_destroy(SeqList_ptr S);






#endif

功能函数

#include "fun.h"

//创建顺序表的定义
SeqList_ptr list_create()
{
	//在堆区申请一个顺序表
	SeqList_ptr S = (SeqList_ptr)malloc(sizeof(SeqList));
	if(NULL == S)
	{
		printf("创建顺序表失败\n");
		return NULL;
	}

	//程序执行至此,表示创建成功
	//给顺序表进行初始化
	bzero(S->data,sizeof(datatype)*MAX); 	//初始化数组
	S->len = 0;

	printf("顺序表创建成功\n");
	return S;
} 
//判断顺序表是否为空
int list_empty(SeqList_ptr S)
{
    //判断传入的顺序表是否合法
    if(NULL==S)
    {
        printf("非法顺序表\n");
        return 0;      //后续不能操作
    }

    //判断顺序表长度
    return 0==S->len ? 1:0;

}

//判断顺序表是否满了
int list_full(SeqList_ptr S)
{
    //判断传入的顺序表是否合法
    if(NULL==S)
    {
        printf("非法顺序表\n");
        return 1;      //后续不能操作
    }

    //判断顺序表长度是否为最大长度
    return S->len == MAX ? 1:0;
}
//向顺序表中添加元素
int list_add(SeqList_ptr S, datatype e)
{
    //判断合法性
    if(list_full(S))
    {
        printf("顺序表已满,添加失败\n");
        return -1;
    }

    //添加逻辑
    S->data[S->len] = e;
    
    //表长变化
    S->len++;
    printf("添加成功\n");
    return 0;
}
//查看顺序表内容函数
void list_show(SeqList_ptr S)
{
    //判空
    if(list_empty(S))
    {
        printf("查看失败\n");
        return ;
    }
    //遍历整个顺序表
    printf("当前顺序表中数据分别是:");
    for(int i=0; i<S->len; i++)
    {
        printf("%d\t", S->data[i]);
    }
    printf("\n");
}

//顺序表按任意位置进行插入操作
int list_insert_pos(SeqList_ptr S,int pos,datatype e)
{
	//判断逻辑
	 if(pos > S->len||pos<0)
	 {
	 	printf("该位置不可插入\n");
		return -1;
	 }
	//腾空逻辑
	for(int i=S->len-1;i>=pos;i--)
	{
		S->data[i+1] = S->data[i];
	}

	//将数据放入顺序表
	S->data[pos] = e;

	//表长变化
	S->len++;
	printf("插入成功\n");
}

//顺序表按位置进行删除
int list_delete_pos(SeqList_ptr S,int pos)
{
		//判断逻辑
	 if(list_empty(S)||pos > S->len||pos<0)
	 {
	 	printf("该位置不可删除\n");
		return -1;
	 }
	//删除逻辑
	for(int i=pos+1;i<S->len;i++)
	{
		S->data[i-1] = S->data[i];
	}

	//表长变化
	S->len--;
	printf("删除成功\n");

}

//顺序表按值查找
int list_search_value(SeqList_ptr S,datatype e)
{
	//判断逻辑
	if(list_empty(S))
	{
		printf("查找失败\n");
		return -1;
	}
	//处理逻辑
	for(int i=0;i<S->len;i++)
	{
		//判断是否跟任意一个元素相等
		if(S->data[i] == e)
		{
			return i;
		}
	}
	printf("查找成功\n");
	return -1; 		//表示没找到
	//表长变化
}

//2.10 顺序表按位置查找返回元素值
int List_search_position(SeqList_ptr S,int pos)
{
	//判断逻辑
	if(pos<0||pos>S->len)
	{
		printf("查找失败\n");
		return -1;
	}
	//运行逻辑
		printf("查找成功\n");
	return S->data[pos];

}

//2.11 顺序表按位置进行修改元素
int list_update_position(SeqList_ptr S,int pos,datatype e)
{
	//判断逻辑
	if(list_empty(S)||pos<0||pos>S->len)
	{
		printf("修改失败\n");
		return -1;
	}
	//运行逻辑
	S->data[pos] = e;
	printf("修改成功\n");
	return 0;
}


//顺序表按值进行修改
int list_update_value(SeqList_ptr S,datatype old_e,datatype new_e)
{
	//判断逻辑
	//通过旧值查找旧值的位置
	//程序执行至此,res表示就是要修改的值的位置//顺序表按值进行修改
    //判断逻辑
    if(list_empty(S))
    {
        printf("修改失败\n");
        return -1;
    }
    
    //通过旧值查找旧值的位置
    int res = list_search_value(S, old_e);
    if(res == -1)
    {
        printf("更新失败\n");
        return -1;
    }

    //程序执行 至此,res表示的就是要修改的值的下标
    S->data[res] = new_e;

    printf("修改成功\n");
    return 0;

}

//2.13 顺序表排序
int list_sort(SeqList_ptr S)
{
		//判断逻辑
	if(list_empty(S))
	{
		printf("修改失败\n");
		return -1;
	}
	for(int i=1;i<S->len;i++)
	{
		for(int j=0;j<S->len-i;j++)
		{
			if(S->data[j] >S->data[j+1])
			{
				datatype temp = S->data[j];
							S->data[j] = S->data[j+1];
							S->data[j+1] = temp;
			}
		}
	}
	printf("修改成功\n");

}

//顺序表去重操作
int list_unique(SeqList_ptr S)
{
	//判断逻辑
	if(list_empty(S) || S->len == 1)
	{
		printf("排序失败\n");
		return -1;
	}
	//去重逻辑
	for(int i=0;i<S->len;i++)  	//遍历所有的元素
	{
		//找到任意元素S->data[i]
		for(int j=i+1;j<S->len;j++)
		{
			if(S->data[i] == S->data[j])
			{
			 	//说明有重复元素
				list_delete_pos(S,j);
				j--; 		//防止漏网之雨
			}
		}
	}
	printf("去重成功\n");
	return 0;
}

//2.15 顺序表翻转
int list_flip(SeqList_ptr S)
{
		//判断逻辑
	if(list_empty(S) || S->len == 1)
	{
		printf("翻转失败\n");
		return -1;
	}
	//翻转逻辑
	for(int i=0;i<S->len/2;i++)
	{
		datatype temp = S->data[i];
		S->data[i] = S->data[S->len-1-i];
		S->data[S->len-1-i] = temp;
	}
	printf("翻转失败\n");
	return 0;
}

//2.16 获取顺序表的长度
int list_long(SeqList_ptr S)
{
	return S->len;
}

//2.17 清空数组
int list_clear(SeqList_ptr S)
{
	bzero(S->data,sizeof(datatype)*MAX); 	//初始化数组
	S->len = 0;
	return -1;
}

//2.18 销毁顺序表
int list_destroy(SeqList_ptr S)
{
	if(NULL == S)
	{
	free(S);
	S = NULL;
	}
	printf("销毁成功\n");
	return 0;
}

主函数文件

#include "fun.h"
#include <myhead.h>

int main(int argc, const char *argv[])
{
	//定义一个顺序表指针,调用创建函数
	SeqList_ptr S = list_create();
	if(NULL==S)
	{
		return -1;
	}

	//顺序表后续操作
	//调用添加数据操作
	list_add(S,3);
	list_add(S,7);
	list_add(S,2);
	list_add(S,5);

	//调用遍历函数
	list_show(S);

    //顺序表按任意位置进行插入操作
	list_insert_pos(S,2,89);
	list_show(S);

	
	//顺序表按位置进行删除
	list_delete_pos(S,2);
	list_show(S);

	//添加元素
	list_add(S,666);
	list_add(S,666);
	list_add(S,666);
	list_add(S,666);
	
	//去重
	list_unique(S);
	list_show(S);
	
	//排序
	list_sort(S);
	list_show(S);

	//翻转
	list_flip(S);
	list_show(S);
	
	//清空数组
	list_clear(S);

	//销毁
	list_destroy(S);

	return 0;
}