完成顺序表

作业需求如下:

完成顺序表的按值修改、按位置查找、排序、最值、去重
实现过程如下:
seqlist.h文件实现函数申明:
#ifndef  __SEQLIST_H__
#define __SEQLIST_H__

#define  MAX 20
typedef int datetype;

typedef struct
{
	datetype date[MAX];
	int len;

}seqlist;

//函数声明

//创建顺序表
seqlist *list_create();
//判空
int list_empty(seqlist *L);

//判满
int list_full(seqlist *L);
//添加元素
int list_add(seqlist *L,datetype e);
//遍历
void list_show(seqlist *L);
//任意位置插入
int list_insert_pos(seqlist *L,int pos,datetype e);

//任意位置删除
int list_delete_pos(seqlist *L, int pos);
//按位置修改
int list_updata_pos(seqlist *L,int pos,datetype new_e);

//按值修改
int list_updata_value(seqlist*L,datetype e,datetype f);
//按位置查找
int list_search_pos(seqlist *L,datetype e);
//按值查找 
int list_search_value(seqlist *l,datetype e);
//排序
int list_sort(seqlist *L);

//最值
int list_max(seqlist *L);
int list_min(seqlist *L);
//去重
int list_removal(seqlist *L);
//销毁

void list_free(seqlist *L);



#endif

seqlist.c文件实现函数的封装:
 

#include "seqlist.h"
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
//函数定义
                               
 //创建顺序表
 seqlist *list_create()
{
	//在堆区申请一个顺序表大小的空间;
	//将该空间的起始地址赋值指针变量报错
	seqlist *L=(seqlist*)malloc(sizeof(seqlist));
	if(NULL==L)
	{
		printf("创建失败\n");
		return NULL;
	}
	//给顺序表初始化
	L->len=0;
	//给数组初始化
	memset(L,0,sizeof(datetype)*MAX);
	printf("创建成功\n");
	return L; //将创建好的顺序表返回

}
 //判空
 int list_empty(seqlist *L)
{
	return L->len==0 ? 1:0; //1表示空 0表示非空
}
 //判满 
 int list_full(seqlist *L)
{
	return L->len==MAX ? 1:0 ;//1表示满 0表示非满

}
 //添加元素
int list_add(seqlist *L,datetype e)
{
	//判断逻辑
	if(list_full(L))
	{
		printf("表满,添加失败\n");
		return 0;
	}
	//添加逻辑
	L->date[L->len] = e; //将要添加的元素放入
	                   //顺序表第一个没有存放元素的数组元素中

	//表的变化
	L->len++;
	printf("添加成功\n");
	return 1;
}
 //遍历 
 void list_show(seqlist *L)
{
	//判断逻辑
	if(NULL==L || list_empty(L))
	{
	printf("空空如也,遍历失败\n");
	return;
	}
//遍历逻辑
   printf("此时顺序表中元素分别是: ");
   for(int i=0;i<L->len;i++)
   {
	   printf("%d\t",L->date[i]);
   }
   printf("\n");
}

 //任意位置插入        
int list_insert_pos(seqlist *L,int pos,datetype e)
{
	//判断逻辑
	if(list_full(L) || pos<0 || pos>L->len)
	{
		printf("插入失败\n");
		return 0;
	}

	//腾空过程
	for(int i=L->len-1;i>=pos;i--)
	{
		L->date[i+1] = L->date[i]; //循环将当前的元素放到后面的一个元素中;

	}
	//插入数据
	L->date[pos] = e; //将要插入的数据放到腾出的空当中

	//表长变化
	L->len++;
	printf("插入成功\n");
	return 0;
}
 
 //任意位置删除        
 int list_delete_pos(seqlist *L,int pos)
{
	//判断逻辑
	if(list_empty(L) || pos<0 || pos>=L->len)
	{
		printf("删除失败\n");
		return 0;
	}
	//移动判断
	for(int i=pos+1;i<L->len;i++)
	{
		L->date[i-1]=L->date[i];
	}
	//表长变化
	L->len--;
	printf("删除成功\n");
	return 1;
}
 //按位置修改                  
int list_updata_pos(seqlist *L,int pos,datetype new_e)
{
	//判断逻辑
	if(list_empty(L) || pos<0 || pos>=L->len)
	{
		printf("修改失败\n");
		return 0;
	}

	//更新逻辑
	L->date[pos] = new_e;
	printf("更新成功\n");
	return 1;
	
}
 //按值修改
 
int list_updata_value(seqlist*L,datetype e,datetype f)
{
	//判断逻辑
	if(list_empty(L))
	{
		printf("按值更新失败\n");
		return -2;
	}

	//更新逻辑
	for(int i=0;i<L->len;i++)
	{
	   if(L->date[i]==e)
	   {
		L->date[i]=f;
		printf("按值更新成功\n");
		return 0;
	   }
	}
	printf("按值更新失败\n");
	return -1;

}
 //按位置查找
 
int list_search_pos(seqlist *L,int pos)
{
	//判断逻辑
	if(list_empty(L) || pos<0 || pos>=L->len)
	{
		printf("查找失败\n");
		return -2;
	}
	//查找逻辑
	return L->date[pos-1];
	printf("查找成功\n");
}
 //按值查找                   
int list_search_value(seqlist *L,datetype e)
{
	//判断逻辑
	if(list_empty(L))
	{
		printf("查找失败\n");
		return -2;
	}
	//查找逻辑
	for(int i=0; i<L->len;i++)  //查找成功
	{
		if(L->date[i]==e)
		{
			return i;
		}
	}
	return -1;  //没找到返回-1

}
 //排序      
 int list_sort(seqlist *L)
{
	seqlist t;
	for(int i=1;i<L->len;i++)
	{
		for(int j=0;j<L->len-i;j++)
		if(L->date[j]>L->date[j+1]) //控制排序方式,从大到小或者从小到大
		{
			 t.date[j]=L->date[j];
			L->date[j]=L->date[j+1];
			L->date[j+1]=t.date[j]; //三杯水交换法
		}
			
	}
}

 //最值 
 //求最大值
 int list_max(seqlist *L)
{
	int max=0;  //存放最值容器,作为返回值
	for(int i=0;i<L->len;i++)
	{
		if(max<L->date[i])
		{
			max=L->date[i];
		}
	}
	return max;
}
//求最小值
int list_min(seqlist *L)
{
	int min=L->date[0];
	for(int i=0;i<L->len;i++)
	{
		if(min>L->date[i])
		{
			min=L->date[i];
		}
	}
	return min;
}

 //去重  
 int list_removal(seqlist *L)
{
	int j=0;
	int i;
	for( i=0;i<L->len;i++)
	{
		if(L->date[j]!=L->date[i]) //如果i,j下标对应值不同则i,j均自增
			                       //否则只有i自增,j不自增
		{
			j++;
		}
		L->date[j]=L->date[i];
	}
	L->len=L->len-(i-j-1);//减去去重去掉的个数
}
 //销毁                        
void list_free(seqlist *L)
{
	if(L != NULL)
	{
		free(L);
		L=NULL;
		printf("销毁成功\n");
	}
}

main.c文件实现函数的测试运行:

#include "seqlist.h"
#include <stdio.h>
int main(int argc, const char *argv[])
{
	//调用创 建函数创建一个顺序表
	seqlist *L = list_create();
	if(NULL==L)
	{
		return -1;
	}
	//调用添加函数
	list_add(L,3);
	list_add(L,8);
	list_add(L,2);
	list_add(L,4);
	list_add(L,8);
	list_add(L,2);
	list_add(L,4);

	//调用遍历函数
	list_show(L);
	
	//调用插入函数
	list_insert_pos(L,1,9);
	list_show(L);
	
	//调用删除函数
	list_delete_pos(L,2);
	list_show(L);
	
	//调用修改函数
	list_updata_pos(L,0,100);
	list_show(L);
	//调用按值修改
	list_updata_value(L,9,3);
	list_show(L);

	//测试按位置查找函数
	int pos1 = list_search_pos(L,1);
	if(pos1>=0)
	{
		printf("您查找的位置的值为%d\n",pos1);
	}
	
	
	//测试按值查找函数
	int pos = list_search_value(L,100);
	if(pos>=0)
	{
		printf("您要查找的值在%d位置\n",pos+1);

	}
	else
	{
		printf("查找失败\n");
	}

	//测试排序
	list_sort(L);
	printf("数组内值从小到大排序为:\n");
	list_show(L);

	//测试最值
	//最大值
	int max=list_max(L);
	printf("数组最大值为%d\n",max);
	//最小值
	int min=list_min(L);
	printf("数组最小值为%d\n",min);

	//测试去重
	list_removal(L);
	list_show(L);



	//测试销毁函数
	list_free(L);
	L=NULL;
	list_show(L);
	return 0;
}

实现效果如下:

ubuntu@ubuntu:02_day$ gcc *.c
ubuntu@ubuntu:02_day$ ./a.out 
创建成功
添加成功
添加成功
添加成功
添加成功
添加成功
添加成功
添加成功
此时顺序表中元素分别是: 3	8	2	4	8	2	4	
插入成功
此时顺序表中元素分别是: 3	9	8	2	4	8	2	4	
删除成功
此时顺序表中元素分别是: 3	9	2	4	8	2	4	
更新成功
此时顺序表中元素分别是: 100	9	2	4	8	2	4	
按值更新成功
此时顺序表中元素分别是: 100	3	2	4	8	2	4	
您查找的位置的值为100
您要查找的值在1位置
数组内值从小到大排序为:
此时顺序表中元素分别是: 2	2	3	4	4	8	100	
数组最大值为100
数组最小值为2
此时顺序表中元素分别是: 2	3	4	8	100	
销毁成功
空空如也,遍历失败
ubuntu@ubuntu:02_day$ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值