数据结构中线性顺序表的使用

作业需求如下:

完成顺序表的按值修改、按位置查找、排序、最值、去重

实现过程如下:

seqlist.h文件实现函数申明:

#ifndef __SEQLIST_H__
#define __SEQLIST_H__

#define MAX 20 //数组的最大容量
typedef int datatype; //类型重定义
//定义顺序表类型
typedef struct
{
	datatype data[MAX];  //顺序表的最大容量
	int len;  //顺序表的长度
}seqlist;

//函数声明

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

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

//任意位置删除
int list_delete(seqlist *L,int pos);
//按位置修改
int list_revise(seqlist *L,int pos,datatype e);
//按值修改
int list_update_value(seqlist *L,datatype e,datatype i);
//按位置查找
int list_search_pos(seqlist *L,int pos);
//按值查找
int list_search_value(seqlist *L,datatype e);
//排序
int list_sort(seqlist *L);
//求最值
int list_max(seqlist *L);
//去重
int list_delete_repeat(seqlist *L);
//销毁
void list_free(seqlist *L);



#endif

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

#include"seqlist.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
seqlist *list_creat()
{
	seqlist *L=(seqlist *)malloc(sizeof(seqlist));
	if(NULL == L)
	{
	printf("创建失败");
		return NULL;
	}

	//给顺序表初始化
	L->len=0;
	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,datatype e)
{
	if(list_full(L)==1)
	{
	printf("顺序表已满");
	return 0;
	}
	L->data[L->len]=e;
	L->len++;
	printf("添加成功\n");
	return 0;
		
}


void list_show(seqlist *L)
{
	if(NULL==L || list_empty(L)==1)
	{
	printf("顺序表为空\n");
	return;
	
	}
	for(int i=0;i<L->len;i++)
	{
	printf("%d\t",L->data[i]);
	
	}
	printf("\n");
}
//从任意位置插入
int list_insert(seqlist *L,int pos,datatype e)
{
//判断是否为空
	if(list_full(L)==1 || pos<0 || pos>L->len)
	{
	printf("插入失败\n");
	}
//腾空过程
	for(int i=L->len-1;i>=pos;i--)
	{
	L->data[i+1]=L->data[i];
	
	}
//插入数据
	L->data[pos]=e;
//表长变化
	L->len++;
	printf("插入成功\n");
	return 1;
	

}

//任意位置删除
int list_delete(seqlist *L,int pos)
{
	//判断逻辑
	if(list_empty(L)==1 || pos<0 || pos>=L->len)
	{
	printf("删除失败\n");
	return 0;
	}
	//移动逻辑
	for(int i=pos;i<L->len;i++) //将当前位置向前移一位
	
	{
	L->data[i]=L->data[i+1];
	}
	//表的变化
	L->len--;
	printf("删除成功\n");
	return 1;
}

//按位置修改
int list_revise(seqlist *L,int pos,datatype e)
{
	//判断顺序表是否为空
	if(list_empty(L)==1 || pos<0 || pos>=L->len)
	{
	
	printf("修改失败\n");
	return 0;
	}
	//查找位置并修改值
	L->data[pos]=e;
	printf("修改成功\n");
	return 1;

}
//按值查找
int list_search_value(seqlist *L,datatype e)
{
	//判断函数是否为空
	if(list_empty(L)==1)
	{
	
	printf("查找失败\n");
	return -2;

	}
	//遍历一遍顺序表,看是否有这个值
	for(int i=0;i<L->len;i++)
	{
		if(L->data[i]==e)
		{
		return i;
		}
	
	}
	
	return -1;//失败没有找到
}

//按值修改
int list_update_value(seqlist *L,datatype e,datatype k)
{
	//判断是否为空
	if(list_empty(L)==1)
	{
		printf("修改失败\n");
		return -2;
	}
	for(int i=0;i<L->len;i++)
	{
		if(L->data[i]==e)
		{
		
			L->data[i]=k;
		}
	
	}
	printf("按值修改成功\n");
	return -1;
	
}
//按位置查找
int list_search_pos(seqlist *L,int pos)
{
	if(list_empty(L)==1 || pos<0 || pos>=L->len)
	{
	printf("查找错误\n");
	return -2;
	}
	for(int i=0;i<L->len;i++)
	{
		if(i==pos)
		{
		return	L->data[i];
		}
	}
}

//升序排序
int list_sort(seqlist *L)
{
	if(list_empty(L)==1)
	{
		printf("排序失败\n");
		return -2;
	}
	
	for(int i=1;i<L->len;i++)
	{
		for(int j=0;j<L->len-i;j++)
		{
			if(L->data[j]>L->data[j+1])
			{
				
				//使用异或对值换位置
				L->data[j]=L->data[j]^L->data[j+1];
				L->data[j+1]=L->data[j]^L->data[j+1];
				L->data[j]=L->data[j]^L->data[j+1];
			}
		}
	}
	return -1;
}
//求最大值
int list_max(seqlist *L)
{
	if(list_empty(L)==1)
	{
		printf("排序失败\n");
		return -2;
	}
	static	int max;
		max=L->data[0];
	for(int i=0;i<L->len;i++)
	{
		if(max<L->data[i])
		{
			max=L->data[i];
		}
	
	}
	return max;
}


//去重
int  list_delete_repeat(seqlist *L)
{
	if(list_empty(L)==1)
	{
		printf("排序失败\n");
		return -1;
	}
	int k=0;
	for(int i=0;i<L->len;i++)
	{
		for(int j=i;j<L->len;j++)
		{
			if(L->data[j]==L->data[i] && j!=i)
			{
				for(k=j;k<L->len+1;k++)
				{
				
				L->data[k]=L->data[k+1];
				L->len--;	
				}
			}
		}
	}
	return 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 *p=list_creat();
	if(NULL==p)
	{
	
	return -1;
	}
	//添加函数
	list_add(p,3);
	list_add(p,4);
	list_add(p,5);
	list_add(p,6);
	//调用遍历函数
	list_show(p);
	//调用按位置插入函数
	list_insert(p,1,8);
	list_show(p);
	//调用删除函数
	list_delete(p,3);
	list_show(p);
	//调用按位置修改函数
	list_revise(p,2,10);
	list_show(p);
	//调用按值查找函数
	int pos=list_search_value(p,8);
	if(pos>=0)
	{
	printf("8所在的位置是:%d\n",pos+1);

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

	//按值修改
	list_update_value(p,6,5);
	list_show(p);

	printf("按位置顺序表下表为2查找的值是:%d\n",list_search_pos(p,2));
	//升序排序
	printf("升序排序为:");
	list_sort(p);
	list_show(p);
	printf("最大值为:%d\n",list_max(p));

	list_add(p,8);
	list_add(p,5);
	list_add(p,3);
	list_show(p);

	list_delete_repeat(p);
	printf("去重后的结果为:");
	list_show(p);
	list_free(p);
	p=NULL;
	list_show(p);
	return 0;
}
	
	

运行结果:

​
创建成功
添加成功
添加成功
添加成功
添加成功
3	4	5	6	
插入成功
3	8	4	5	6	
删除成功
3	8	4	6	
修改成功
3	8	10	6	
8所在的位置是:2
按值修改成功
3	8	10	5	
按位置顺序表下表为2查找的值是:10
升序排序为:3	5	8	10	
最大值为:10
添加成功
添加成功
添加成功
3	5	8	10	8	5	3	
去重后的结果为:3	5	8	10	
销毁成功
顺序表为空

​

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值