需求:创建一张顺序表,并对其进行如下操作:
- 判空
- 判满
- 添加元素
- 遍历
- 任意位置插入
- 任意位置删除
- 按位置修改
- 按值修改
- 按位置查询
- 按值查询
- 排序
- 求最值
- 去重
- 销毁
代码实现过程:
seqList.h:
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#define MAX 20 //数组最大容量
typedef int datatype; //类型重定义,顺序表的数据类型
//定义顺序表类型
typedef struct {
datatype data[MAX]; //存储顺序表的数组
int len; //顺序表的长度
}seqList;
// 声明功能 如下
//创建顺序表
seqList *list_create();
//判空
int list_ifempt(seqList *L);
//判满
int list_iffull(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_modify_pos(seqList *L,int pos,datatype e);
//按值修改
int list_modify_value(seqList *L,int value,datatype e);
//按位置查找
int list_search_pos(seqList *L,int pos);
//按值查找
int list_search_value(seqList *L,int value);
//排序
int list_sort(seqList *L);
//求最值
int list_border_max(seqList *L);
int list_border_min(seqList *L);
//去重
int list_delete_same(seqList *L);
//销毁
void list_free(seqList *L);
#endif
seqList.c:
#include"seqlist.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
// 定义函数 如下
//创建顺序表
seqList *list_create()
{
seqList *L = (seqList*)malloc(sizeof(seqList)); //申请一个顺序表大小的空间
if( L == NULL ) //申请失败,给出提示信息,返回空指针
{
printf("申请空间失败\n");
return NULL;
}
L->len = 0; //申请成功,初始化顺序表数组,给出提示信息,返回空间首地址
memset(L,0,sizeof(datatype)*MAX);
printf("申请空间成功\n");
return L;
}
//判空
int list_ifempt(seqList *L){
return L->len==0;
}
//判满
int list_iffull(seqList *L){
return L->len==MAX;
}
//添加元素
int list_add(seqList *L,datatype e){
//逻辑判断
if(list_iffull(L)){
printf("顺序表已满,添加失败\n");
return 0;
}
//添加的逻辑
L->data[L->len]=e; //L的data L->data ,L的len L->len
//表的变化
L->len++;
printf("添加成功\n");
return 1;
}
//遍历
void list_show(seqList *L){
//判空
if( NULL == L || list_ifempt(L)){
printf("顺序表为空,遍历失败\n");
return;
}
//遍历
printf("顺序表中元素分别是:");
for(int i=0;i<L->len;i++){
printf("%-5d",L->data[i]);
}
putchar(10);
}
//任意位置插入
int list_insert(seqList *L,int pos,datatype e){
//判满
if(list_iffull(L)){
printf("顺序表已满,添加失败\n");
return 0;
}
//插入位置
if(pos>L->len||pos<0)
{
printf("插入位置错误\n");
return 0;
}
//腾空一位
for(int i=L->len;i>pos;i--){
L->data[i]=L->data[i-1];
}
//插入数据
L->data[pos]=e;
//表长变化
L->len++;
printf("插入成功\n");
//返回值成功反1,失败反0
return 1;
}
//任意位置删除
int list_delete(seqList *L,int pos){
//判空
if(list_ifempt(L)){
printf("顺序表为空,遍历失败\n");
return 0;
}
//删除位置
if(pos>=L->len||pos<0){
printf("删除位置错误\n");
return 0;
}
//缩进一位
for(int i=pos;i<L->len;i++){
L->data[i]=L->data[i+1];
}
//表长变化
L->len--;
printf("删除成功\n");
//返回值成功反1,失败反0
return 1;
}
//按位置修改
int list_modify_pos(seqList *L,int pos,datatype e){
//判空
if(list_ifempt(L)){
printf("顺序表为空,修改失败\n");
return 0;
}
//修改位置
if(pos>=L->len||pos<0)
{
printf("修改位置错误\n");
return 0;
}
//修改数据
L->data[pos]=e;
printf("修改成功\n");
//返回值成功反1,失败反0
return 1;
}
//按值修改
int list_modify_value(seqList *L,int value,datatype e){
//判空
if(list_ifempt(L)){
printf("顺序表为空,修改失败\n");
return 0;
}
//修改数据
for(int i=0;i<L->len;i++){
if(value==L->data[i]){
L->data[i]=e;
printf("修改成功\n");
return 1; //若在此处返回值,则修改第一个
}
}
printf("修改成功\n");
//返回值成功反1,失败反0
//return 1; //若在此处返回值,则全部修改
}
//按位置查找
int list_search_pos(seqList *L,int pos){
//判空
if(list_ifempt(L)){
printf("顺序表为空,查找失败\n");
return 404;
}
//查找位置
if(pos>=L->len||pos<0){
printf("查找位置错误\n");
return 404;
}
//查找数据
//返回值成功反该值,失败反pos
printf("查找成功\n");
return L->data[pos];
}
//按值查找 全部查找(形参,数组)
int list_search_value(seqList *L,int value){
//判空
if(list_ifempt(L)){
printf("顺序表为空,查找失败\n");
return -2;
}
//查找数据
for(int i=0;i<L->len;i++){
if(value==L->data[i]){
return i;
}
}
//返回值成功反i,失败反-1
return -1;
}
//排序
int list_sort(seqList *L){
int temp,i,j;
int mini=0;
//判空
if(list_ifempt(L)){
printf("顺序表为空,排序失败\n");
return 0;
}
/*冒泡排序
for(i=0;i<L->len-1;i++){
for(j=0;j<L->len-i-1;j++){
if(L->data[j]>L->data[j+1]){
temp=L->data[j];
L->data[j]=L->data[j+1];
L->data[j+1]=temp;
}
}
}
*/
//选择排序
for(i=0;i<L->len-1;i++){
mini=i;
for(j=i+1;j<=L->len-1;j++){
if(L->data[mini]>L->data[j]){
mini=j;
}
}
temp=L->data[i];
L->data[i]=L->data[mini];
L->data[mini]=temp;
}
//返回值成功反1,失败反0
return 1;
}
//求最值
int list_border_max(seqList *L){
//判空
if(list_ifempt(L)){
printf("顺序表为空,查找失败\n");
return 404;
}
//求最大值
int max=L->data[0];
for(int i=1;i<L->len;i++){
if(max<L->data[i]){
max=L->data[i];
}
}
//返回值成功返回最大值,失败返回404
return max;
}
int list_border_min(seqList *L){
//判空
if(list_ifempt(L)){
printf("顺序表为空,查找失败\n");
return 404;
}
int min=L->data[0];
for(int i=1;i<L->len;i++){
if(min>L->data[i]){
min=L->data[i];
}
}
//成功返回最小值,失败返回404
return min;
}
//去重
int list_delete_same(seqList *L){
//判空
if(list_ifempt(L)){
printf("顺序表为空,查找失败\n");
return 0;
}
//去重操作
int i=0,j=1,k=1,u,o;
int flag;
int len=L->len-1;
while(len--){
if( L->data[i] != L->data[j] ){
flag=0;
for(u=j;u>=1;u--){
o=j;
if(L->data[o]==L->data[u-1]){
flag=1;
}
}
if(flag==0){
L->data[k]=L->data[j];
k++;
}
}
i++;
j++;
}
//表长变化
L->len=k;
//返回值成功反1,失败反0
return 1;
}
//销毁
void list_free(seqList *L){
if(NULL!=L){
free(L);
L=NULL;
printf("销毁成功\n");
}
}
main.c:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"seqlist.h"
int main(int argc, const char *argv[])
{
printf("-----------创建数据表-------------\n");
seqList *L=list_create();
if( L == NULL )
{
return -1;
}
list_add(L,1);
list_add(L,2);
list_add(L,3);
list_add(L,2);
list_add(L,3);
list_add(L,3);
list_add(L,2);
list_add(L,4);
list_show(L);
printf("----------------------------------\n");
putchar(10);
printf("------------验证去重--------------\n");
list_delete_same(L);
list_show(L);
printf("----------------------------------\n");
putchar(10);
printf("----------重新创建数据表----------\n");
free(L);
L=list_create();
if( L == NULL )
{
return -1;
}
list_add(L,rand()%10);
list_add(L,rand()%10);
list_add(L,rand()%10);
list_add(L,rand()%10);
list_add(L,rand()%10);
list_add(L,rand()%10);
list_show(L);
printf("----------------------------------\n");
putchar(10);
printf("-----------任意位置插入-----------\n");
list_insert(L,3,4);
list_show(L);
printf("----------------------------------\n");
putchar(10);
printf("-----------任意位置删除-----------\n");
list_delete(L,2);
list_show(L);
printf("----------------------------------\n");
putchar(10);
printf("-----------按位置修改-------------\n");
list_modify_pos(L,4,1);
list_show(L);
printf("----------------------------------\n");
putchar(10);
printf("------------按值修改--------------\n");
list_modify_value(L,3,1);
list_show(L);
printf("----------------------------------\n");
putchar(10);
printf("-----------按位置查找-------------\n");
int value=list_search_pos(L,1);
printf("下标为1的值是%d\n",value);
list_show(L);
printf("----------------------------------\n");
putchar(10);
printf("------------按值查找--------------\n");
int pos=list_search_value(L,4);
printf("%d是第%d个数\n",L->data[pos],pos);
list_show(L);
printf("----------------------------------\n");
putchar(10);
printf("---------------排序---------------\n");
list_sort(L);
list_show(L);
printf("----------------------------------\n");
putchar(10);
printf("------------求最大值--------------\n");
int max=list_border_max(L);
printf("最大值为%d\n",max);
list_show(L);
printf("----------------------------------\n");
putchar(10);
printf("------------求最小值--------------\n");
int min=list_border_min(L);
printf("最小值为%d\n",min);
list_show(L);
printf("----------------------------------\n");
putchar(10);
printf("--------------销毁----------------\n");
list_free(L);
L=NULL;
list_show(L);
printf("----------------------------------\n");
return 0;
}
代码实现结果:
-----------创建数据表-------------
申请空间成功
添加成功
添加成功
添加成功
添加成功
添加成功
添加成功
添加成功
添加成功
顺序表中元素分别是:1 2 3 2 3 3 2 4
----------------------------------------------验证去重--------------
顺序表中元素分别是:1 2 3 4
--------------------------------------------重新创建数据表----------
申请空间成功
添加成功
添加成功
添加成功
添加成功
添加成功
添加成功
顺序表中元素分别是:3 6 7 5 3 5
---------------------------------------------任意位置插入-----------
插入成功
顺序表中元素分别是:3 6 7 4 5 3 5
---------------------------------------------任意位置删除-----------
删除成功
顺序表中元素分别是:3 6 4 5 3 5
---------------------------------------------按位置修改-------------
修改成功
顺序表中元素分别是:3 6 4 5 1 5
----------------------------------------------按值修改--------------
修改成功
顺序表中元素分别是:1 6 4 5 1 5
---------------------------------------------按位置查找-------------
查找成功
下标为1的值是6
顺序表中元素分别是:1 6 4 5 1 5
----------------------------------------------按值查找--------------
4是第2个数
顺序表中元素分别是:1 6 4 5 1 5
-------------------------------------------------排序---------------
顺序表中元素分别是:1 1 4 5 5 6
----------------------------------------------求最大值--------------
最大值为6
顺序表中元素分别是:1 1 4 5 5 6
----------------------------------------------求最小值--------------
最小值为1
顺序表中元素分别是:1 1 4 5 5 6
------------------------------------------------销毁----------------
销毁成功
顺序表为空,遍历失败
----------------------------------