dataStructureDay030803

有关顺序表的操作

头文件seqlist.h:

#ifndef _SEQLIST_H_
#define _SEQLIST_H_



#define MAX 40 				//定义顺序表的最大容量
typedef int datatype;  //以整形为例,数据元素类型

//定义顺序表类型的基本格式
typedef struct
{
	datatype data[MAX];    //存储数据元素的数组
	int len;             //存储当前顺序表的长度
}seqlist,*seqlist_ptr;   //重命名为一个结构体变量,和一个指针类型

//创建顺序表
seqlist_ptr listCreate();

//判断空
int listEmpty(seqlist_ptr S);

//判断满
int listFULL(seqlist_ptr S);

//向顺序表中添加元素
int listAdd(seqlist_ptr S,datatype e);

//遍历顺序表
void listShow(seqlist_ptr S);
//任意位置插入元素
int listInsertByPos(seqlist_ptr S,int pos,datatype e);
//任意位置删除元素
//
//按位置进行修改
//
//按值进行修改
//
//查找指定位置的元素
//
//按值进行查找元素(找到return真,否则假)
int listSearchByValue(seqlist_ptr S,datatype e);
//将顺序表排序(使用选择排序,传一个flag,1升0降)
void listSort(seqlist_ptr S,int flag);
//将顺序表去重
//
//扩容
//
//求最值操作
datatype listMoValue(seqlist_ptr S,int flag);
//顺序表反转
void listReverse(seqlist_ptr S);
//顺序表释放


#endif

函数seqlist.c:

#include"seqlist.h"
#include
#include
#include
//创建顺序表
seqlist_ptr listCreate(){
	//在堆区申请一个顺序表的空间大小
	seqlist_ptr S = (seqlist_ptr)malloc(sizeof(seqlist));
	//判断是否申请成功
	if(NULL == S){
		printf("顺序表创建失败\n");
		return NULL;
	}

	//此时顺序表已经创建成功
	memset(S->data,0,sizeof(S->data));  //清空数组
	S->len = 0;  //数组长度清零

	printf("顺序表创建成功\n");
	return S;
}
//判满,成功返回真,失败返回假
int listFULL(seqlist_ptr S){
	//判断逻辑
	if(NULL == S){
		printf("所给顺序表不合法\n");
		return 0;
	}

	//合法,则返回是否已经满了
	return S->len == MAX;
}
//判空,如果空返回真,非空返回假
int listEmpty(seqlist_ptr S){
	//判断逻辑
	if(NULL == S){
		printf("所给顺序表不合法\n");
		return 0;
	}

	//合法返回是否空
	return S->len == 0;
}
//向顺序表中添加元素
int listAdd(seqlist_ptr S,datatype e){
	//判断逻辑
	if(NULL == S||listFULL(S)){
		printf("添加失败\n");
		return 0;
	}

	//添加逻辑
	S->data[S->len] = e;//将新元素放入最后一个位置
	
	//表的变化
	S->len++;

	printf("添加成功\n");
	return 1;
}
//遍历顺序表
void listShow(seqlist_ptr S){
	//判断逻辑
	if(NULL == S||listEmpty(S)){
		printf("遍历失败\n");
		return; //会报警告
	}

	//遍历顺序表
	printf("当前顺序表的元素分别是:");
	int i = 0;
	for(i=0; ilen; i++){
		printf("%d\t",S->data[i]);
	}
	putchar(10);
}
//任意位置插入元素
int listInsertByPos(seqlist_ptr S,int pos,datatype e){
	//判断逻辑
	if(NULL == S||listFULL(S)||pos<0||pos>S->len){
		printf("插入失败\n");
		return 0; //会报警告
	}

	//腾空过程
	int i = 0;
	for(i=S->len-1; i>=pos; i--){
		S->data[i+1] = S->data[i]; //将当前元素后移
	}

	//插入逻辑
	S->data[pos] = e;  //将新元素放入要插入的位置
	
	//表的变化
	S->len++;

	printf("插入成功\n");
//	listShow(S);
	return 1;
}
//按值进行查找元素(找到return真,否则假)
int listSearchByValue(seqlist_ptr S,datatype e){
	//判断逻辑
	if(NULL == S){
		printf("所给顺序表不合法\n");
		return 0;
	}
	//遍历顺序表对比是否有与要找的元素相同的元素
	for(int i=0; ilen; i++){
		if(e == S->data[i]){
			return 1;   //找到就直接返回真
		}
	}
	return 0;  //如果整个for循环都执行完了,还没有跳出,说明遍历顺序表也没能找到要找的元素
	//返回假,表示没找到。
}
//将顺序表排序(使用选择排序,传一个flag,1升0降)
void listSort(seqlist_ptr S,int flag){
	//判断逻辑
	if(NULL == S){
		printf("所给顺序表不合法\n");
		return;
	}
	//选择排序
	int i = 0;
	int j = 0;
	int index = 0;//定义记录下标的变量
	datatype tmp = 0;//定义交换的中间变量
	for(i=1; ilen; i++){   //控制交换的趟数
		index = 0;
		if(1 == flag){         //如果flag是1,表示升序排列
			for(j=0; j<=S->len-i; j++){  //一直要比到data中的最后一个元素,即下表为len-1的元素,
				//之后每次都可以少比较1个元素,但由于i是从1开始的,所以判断条件为<=len-i
				if(S->data[index]data[j]){
					index = j;//如果遍历到的元素比index对应的元素还大,就把更大的值的下标赋给index,以找到最大值的下标
				}
			}
			if(index!=S->len-i){  //将得到的最大值,和最后一个元素交换位置,第二大的和倒数第二个
				//元素交换位置,以此类推
				tmp = S->data[index];
				S->data[index] = S->data[S->len-i];
				S->data[S->len-i] = tmp;
			}
		}else{//降序排列
			for(j=0; j<=S->len-i; j++){  //一直要比到data中的最后一个元素,即下表为len-1的元素,
				//之后每次都可以少比较1个元素,但由于i是从1开始的,所以判断条件为<=len-i
				if(S->data[index]>S->data[j]){
					index = j;//如果遍历到的元素比index对应的元素还小,就把更小的值的下标赋给index,以找到最小值的下标
				}
			}
			if(index!=S->len-i){  //将得到的最小值,和最后一个元素交换位置,第二小的和倒数第二个
				//元素交换位置,以此类推
				tmp = S->data[index];
				S->data[index] = S->data[S->len-i];
				S->data[S->len-i] = tmp;
			}			
		}
	}
}
//求最值操作
datatype listMoValue(seqlist_ptr S,int flag){
	//判断逻辑
	if(NULL == S){
		printf("所给顺序表不合法\n");
		return 0;
	}	
	//求最值
	datatype value = S->data[0]; //定义一个变量保存最值
	int i = 0;
	for(i=0; ilen; i++){
		if(1 == flag){   //如果flag为1说明要求最大值,否则为最小值
			if(value< S->data[i]){
				value = S->data[i];
			}
		}else{
			if(value> S->data[i]){
				value = S->data[i];
			}		
		}
	}
	if(1 == flag){
		printf("最大值为:");
	}else{
		printf("最小值为:");
	}
	return value;
}
//顺序表反转
void listReverse(seqlist_ptr S){
	//判断逻辑
	if(NULL == S){
		printf("所给顺序表不合法\n");
		return;
	}
	int i = 0;
	datatype tmp = 0;//定义一个中间变量
	for(i=0; ilen/2; i++){    //交换次数为len/2次,比如,有4个元素,那么len正好等于4,交换2次,3个元素交换1次,3/2也是1
		tmp = S->data[i];
		S->data[i] = S->data[S->len-1-i];
		S->data[S->len-1-i] = tmp;
	}
}

测试:main.c:

#include"seqlist.h"
#include

int main(int argc, const char *argv[])
{
	//申请一个顺序表
	seqlist_ptr S = listCreate();
	if(NULL == S){
		return -1;
	}

	//调用添加函数
	listAdd(S,3);
	listAdd(S,8);
	listAdd(S,2);
	listAdd(S,4);
	
	//调用遍历函数
	listShow(S);

	//定义插入元素,并赋值
	datatype e = 0;
	printf("请输入想要插入的元素:");
	scanf("%d",&e);
	//定义插入的位置
	int pos = 0;
	printf("请输入想要插入的位置:");
	scanf("%d",&pos);
	//调用插入函数
	listInsertByPos(S,pos,e);
	//调用遍历函数查看插入后效果
	listShow(S);

	//定义查找元素
	datatype ts = 0;
	printf("请输入想要查找的元素:");
	scanf("%d",&ts);
	//因为查找函数的返回值为1或0,直接在if判断语句中调用该函数
	if(listSearchByValue(S,ts)){
		printf("顺序表中成功找到该元素\n");
	}else{
		printf("顺序表中没有找到该元素\n");
	}
	
	//定义旗帜
	int flag = 0;
	printf("请输入想要的排序方式(1升0降):");
	scanf("%d",&flag);
	//调用排序函数
	listSort(S,flag);
	//调用遍历函数查看排序后效果
	printf("升序排列后:\n");
	listShow(S);
	
	//定义最值的旗帜
	int Mflag = 0;
	printf("如果要求最大值请输入1,否则默认求最小值:");
	scanf("%d",&Mflag);
	//调用求最值函数
	printf("%d\n",listMoValue(S,Mflag));

	printf("反转后:\n");
	//调用翻转函数
	listReverse(S);
	//调用遍历函数查看反转后效果
	listShow(S);	
	return 0;
}

升序排列求最大值:

降序排列求最小值:

思维导图 

 

 

你可能感兴趣的:(数据结构,算法,c语言)