一:头文件
#ifndef _sxb_h_
#define _sxb_h_
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 40
typedef int datatype;
typedef struct//定义顺序表
{
datatype data[MAX];
int len;
}seqList,*seqListPtr;
seqListPtr list_create();//创建顺序表
int list_empty(seqListPtr S);//判空
int list_full(seqListPtr S);//判满
int list_add(seqListPtr S,datatype e);//向顺序表中添加元素
void list_show(seqListPtr S);//遍历顺序表
int list_insert_pos(seqListPtr S,datatype e,int pos);//任意位置插入元素
int list_delete_pos(seqListPtr S,int pos);//任意位置删除元素
int list_updata_pos(seqListPtr S,int pos,datatype e);//按位置进行修改
int list_updata_value(seqListPtr S,datatype old_e,datatype new_e);//按值进行修改
datatype *list_search_pos(seqListPtr S,int pos);//查找指定位置的元素,返回地址
int list_search_value(seqListPtr S,datatype e);//按值进行查找元素位置
void list_sort(seqListPtr S,int flag);//将顺序表排序,选择排序0将1升
void list_unique(seqListPtr S);//顺序表去重
datatype list_mvalue(seqListPtr S,int flag);//求最值操作0min 1max
void list_reverse(seqListPtr S);//顺序表反转
void list_free(seqListPtr S);//释放顺序表
#endif
二:功能
#include"sxb.h"
seqListPtr list_create()//创建顺序表
{
seqListPtr S=(seqListPtr)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 list_empty(seqListPtr S)//判空
{
if(NULL==S)
{
printf("所给顺序表不合法\n");
return 0;
}
return S->len==0;
}
int list_full(seqListPtr S)//判满
{
if(NULL==S)
{
printf("所给顺序表不合法\n");
return 0;
}
return S->len==MAX;
}
int list_add(seqListPtr S,datatype e)//向顺序表中添加元素
{
if(NULL==S||list_full(S))
{
printf("添加失败\n");
return 0;
}
S->data[S->len]=e;
S->len++;
printf("添加成功\n");
return 1;
}
void list_show(seqListPtr S)//遍历顺序表
{
if(NULL==S||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(seqListPtr S,datatype e,int pos)//任意位置插入元素
{
if(NULL==S||list_full(S)||pos<0||pos>S->len)
{
printf("插入失败\n");
return 0;
}
for(int i=S->len-1;i>=pos;i--)
{
S->data[i+1]=S->data[i];
}
S->data[pos]=e;
S->len++;
printf("插入成功\n");
return 1;
}
int list_delete_pos(seqListPtr S,int pos)//任意位置删除元素
{
if(NULL==S||list_empty(S)||pos<0||pos>=S->len)
{
printf("删除失败\n");
return 0;
}
for(int i=pos;i<S->len;i++)
{
S->data[i]=S->data[i+1];
}
S->len--;
printf("删除成功\n");
return 1;
}
int list_updata_pos(seqListPtr S,int pos,datatype e)//按位置进行修改
{
if(NULL==S||list_empty(S)||pos<0||pos>=S->len)
{
printf("更新失败\n");
return 0;
}
S->data[pos]=e;
printf("更新成功\n");
return 1;
}
int list_search_value(seqListPtr S,datatype e)//按值进行查找元素位置
{
if(NULL==S||list_empty(S))
{
printf("查找失败\n");
return 0;
}
for(int i=0;i<S->len;i++){
if(e==S->data[i])
{
return i;
}
}
printf("无该元素\n");
return -1;
}
int list_updata_value(seqListPtr S,datatype old_e,datatype new_e)//按值进行修改
{
if(NULL==S||list_empty(S))
{
printf("修改失败\n");
return 0;
}
int index=0;
while((index=list_search_value(S,old_e))>=0)
{
list_updata_pos(S,index,new_e);
}
printf("修改成功\n");
return 1;
}
datatype *list_search_pos(seqListPtr S,int pos)//查找指定位置的元素,返回地址
{
if(NULL==S||list_empty(S)||pos<0||pos>=S->len)
{
printf("查找失败\n");
return 0;
}
return &S->data[pos-1];
}
void list_sort(seqListPtr S,int flag)//将顺序表排序,选择排序0将1升
{
if(NULL==S||list_empty(S))
{
printf("排序失败\n");
return;
}
int i=0,j=0,k=0,t=0;
if(0==flag)
{
for(i=1;i<S->len;i++)
{
k=i-1;
for(j=i-1;j<S->len;j++)
{
if(S->data[k]<S->data[j])
{
k=j;
}
}
if(k!=i-1)
{
t=S->data[k];
S->data[k]=S->data[i-1];
S->data[i-1]=t;
}
}
printf("降序完成\n");
}
if(1==flag)
{
for(i=1;i<S->len;i++)
{
k=i-1;
for(j=i-1;j<S->len;j++)
{
if(S->data[k]>S->data[j])
{
k=j;
}
}
if(k!=i-1)
{
t=S->data[k];
S->data[k]=S->data[i-1];
S->data[i-1]=t;
}
}
printf("升序完成\n");
}
}
void list_unique(seqListPtr S)//顺序表去重
{
if(NULL==S|S->len<=1)
{
printf("排序失败\n");
return;
}
for(int i=0;i<S->len;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");
}
datatype list_mvalue(seqListPtr S,int flag)//求最值操作0min 1max
{
if(NULL==S||list_empty(S))
{
printf("求值失败\n");
return 0;
}
int i=0;
datatype min=S->data[0];
datatype max=S->data[0];
if(0==flag)
{
for(i=1;i<S->len;i++)
{
if(min>S->data[i])
{
min=S->data[i];
}
}
return min;
}
if(1==flag)
{
for(i=1;i<S->len;i++)
{
if(max<S->data[i])
{
max=S->data[i];
}
}
return max;
}
}
void list_reverse(seqListPtr S)//顺序表反转
{
if(NULL==S||list_empty(S))
{
printf("反转失败\n");
return;
}
datatype a=0,t=0;
a=S->len-1;
for(int i=0;i<a;i++,a--)
{
t=S->data[i];
S->data[i]=S->data[a];
S->data[a]=t;
}
printf("反转成功\n");
}
void list_free(seqListPtr S)//释放顺序表
{
if(NULL != S)
{
free(S);
S=NULL;
}
printf("释放顺序表成功\n");
}
三:主函数(测试)
#include "sxb.h"
int main(int argc, const char *argv[])
{
seqListPtr S=list_create();
if(NULL==S)
{
return -1;
}
list_add(S,3);
list_add(S,33);
list_add(S,2);
list_add(S,8);
list_add(S,2);
list_add(S,4);
list_add(S,2);
list_add(S,2);
list_add(S,2);
list_add(S,2);
list_show(S);
printf("请输入要添加的位置:");
int c=0;
scanf("%d",&c);
printf("请输入要添加的数:");
int d=0;
scanf("%d",&d);
list_insert_pos(S,d,c-1);
list_show(S);
printf("请输入要删除的位置:");
int b=0;
scanf("%d",&b);
list_delete_pos(S,b-1);
list_show(S);
printf("请输入要更新的位置:");
int e=0;
scanf("%d",&e);
printf("请输入要更新的数:");
int f=0;
scanf("%d",&f);
list_updata_pos(S,e-1,f);
list_show(S);
printf("请输入要修改的数:");
int g=0;
scanf("%d",&g);
printf("请输入修改后的数:");
int k=0;
scanf("%d",&k);
list_updata_value(S,g,k);
list_show(S);
printf("请输入要修改的位置:");
int j=0;
scanf("%d",&j);
printf("请输入修改后的数:");
int m=0;
scanf("%d",&m);
datatype *p=list_search_pos(S,j);
if(NULL!=p)
{
*p=m;
}
list_show(S);
list_sort(S,0);
list_show(S);
list_sort(S,1);
list_show(S);
printf("max=%d\n",list_mvalue(S,1));
printf("min=%d\n",list_mvalue(S,0));
list_reverse(S);
list_show(S);
list_unique(S);
list_show(S);
list_free(S);
S=NULL;
return 0;
}
//ps可以添加一个输入输出的函数调用(用switch ..case)实现
四、测试
ubuntu@ubuntu:3$ gcc *.c
ubuntu@ubuntu:3$ ./a.out
顺序表创建成功
添加成功
添加成功
添加成功
添加成功
添加成功
添加成功
添加成功
添加成功
添加成功
添加成功
当前顺序表的元素分别是:3 33 2 8 2 4 2 2 2 2
请输入要添加的位置:11
请输入要添加的数:3
插入成功
当前顺序表的元素分别是:3 33 2 8 2 4 2 2 2 2 3
请输入要删除的位置:1
删除成功
当前顺序表的元素分别是:33 2 8 2 4 2 2 2 2 3
请输入要更新的位置:3
请输入要更新的数:5
更新成功
当前顺序表的元素分别是:33 2 5 2 4 2 2 2 2 3
请输入要修改的数:2
请输入修改后的数:6
更新成功
更新成功
更新成功
更新成功
更新成功
更新成功
无该元素
修改成功
当前顺序表的元素分别是:33 6 5 6 4 6 6 6 6 3
请输入要修改的位置:6
请输入修改后的数:7
当前顺序表的元素分别是:33 6 5 6 4 7 6 6 6 3
降序完成
当前顺序表的元素分别是:33 7 6 6 6 6 6 5 4 3
升序完成
当前顺序表的元素分别是:3 4 5 6 6 6 6 6 7 33
max=33
min=3
反转成功
当前顺序表的元素分别是:33 7 6 6 6 6 6 5 4 3
删除成功
删除成功
删除成功
删除成功
去重成功
当前顺序表的元素分别是:33 7 6 5 4 3
释放顺序表成功