顺序表的创建、输入、判空、判满、添加、遍历、删除、冒泡排序、选择排序
按值查找/删除,按位置查找/删除、释放等功能函数,主函数,头文件如下:
头文件:
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20
typedef int datatype;
typedef struct{;
datatype data[MAX];
int len;
}seqlist;
//创建顺序表
seqlist* list_create();
//判空函数
int list_empty(seqlist *S);
//判满函数
int list_full(seqlist *S);
//添加元素
int list_add(seqlist *S,datatype e);
//显示数据
void list_show(seqlist *S);
//任意位置插入
int list_insert(seqlist *S,int pos,datatype e);
//任意位置删除
int list_delete(seqlist*S,int pos);
//按值查找,返回对应的位置
int list_search_value(seqlist *S,datatype e);
//按位置查找,并返回查找成功后的值
datatype list_search_pos(seqlist *S,int pos);
//按值修改
int list_update_value(seqlist *S,datatype old_e,datatype new_e);
//按位置修改
int list_update_pos(seqlist *S,int pos,datatype new_e);
//排序
void list_sort(seqlist *S);
//选择排序
void list_selt_sort(seqlist *S);
//去重
void list_delte_repeat(seqlist *S);
//释放表
void list_free(seqlist **S);
#endif
功能函数(func.c)
#include "head.h"
//创建顺序表
seqlist* list_create()
{
//在堆区申请一个顺序表空间,将首地址给S
seqlist *S=(seqlist*)malloc(sizeof(seqlist));
if(NULL==S)
{
puts("申请空间失败");
return NULL;
}
//将数组和顺序表初始化置零
memset(S->data,0,sizeof(S->data));
S->len=0;
puts("创建成功");
return S;
}
//判空函数
int list_empty(seqlist *S)
{
return S->len==0 ? 1:0;
}
//判满函数
int list_full(seqlist *S)
{
return S->len==MAX ? 1:0; //0表示不满,1表示满
}
//添加元素
int list_add(seqlist *S,datatype e)
{
//判断是否为满
if(list_full(S))
{
printf("表满,无法插入!\n");
return -1;
}
//添加逻辑
S->data[S->len]=e;
S->len++;
printf("添加成功\n");
return 0;
}
//显示数据
void list_show(seqlist *S)
{
if(NULL==S)
{
printf("表不存在\n");
return;
}
if(list_empty(S))
{
printf("空空如也,遍历个der!\n");
return;
}
printf("目前顺序表的顺序是:");
for(int i=0;i<S->len;i++)
{
printf("%d\t",S->data[i]);
}
printf("\n");
}
//任意插入,删除
int list_insert(seqlist *S,int pos,datatype e)
{
//判断逻辑
if(pos<0 || pos>S->len ||list_full(S))
{
printf("插入失败!\n");
return -1;
}
//腾空
for(int i=S->len-1;i>=pos;i--)
{
S->data[i+1]=S->data[i];
}
//插入数据
S->data[pos]=e;
//表的变化
printf("插入成功!\n");
S->len++;
return 0;
}
//任意位置删除
int list_delete(seqlist*S,int pos)
{
//判断逻辑
if(list_empty(S))
{
printf("已为空,无法删除!\n");
return -1;
}
if(pos<0 || pos>S->len-1)
{
printf("删除位置不合法!\n");
return -2;
}
//删除数据
for(int i=pos;i<S->len;i++)
{
S->data[i]=S->data[i+1];
}
//表的变化
S->len--;
printf("删除成功!\n");
return 0;
}
//按值查找,返回对应的位置
int list_search_value(seqlist *S,datatype e)
{
//判断逻辑
if(list_empty(S))
{
printf("该表为空\n");
return -1;
}
//按值查找
for(int i=0;i<S->len;i++)
{
if(e==S->data[i])
{
printf("查找成功\n");
return i;
}
}
printf("查找失败!\n");
return -2;
}
//按位置查找,并返回查找成功后的值
datatype list_search_pos(seqlist *S,int pos)
{
//判断逻辑
if(list_empty(S))
{
printf("该表为空\n");
return -1;
}
if(pos<0 || pos>S->len-1)
{
printf("该位置不合法!\n");
return -2;
}
printf("查找成功\n");
return S->data[pos];
}
//按值修改
int list_update_value(seqlist *S,datatype old_e,datatype new_e)
{
int pos=-1;
pos=list_search_value(S,old_e);
if(pos>=0)
{
S->data[pos]=new_e;
printf("修改成功\n");
return 0;
}else
{
printf("修改失败\n");
return -1;
}
}
//按位置修改
int list_update_pos(seqlist *S,int pos,datatype new_e)
{
//判断逻辑
if(pos<0 || pos>S->len-1)
{
printf("该位置不合法!\n");
return -1;
}
//修改对应位置内容
S->data[pos]=new_e;
printf("修改成功\n");
return 0;
}
//冒泡排序
void list_sort(seqlist *S)
{
int i,j;
datatype temp;
for(i=1;i<S->len;i++)
{
for(j=0;j<S->len-i;j++)
{
if(S->data[j] > S->data[j+1]){
temp=S->data[j]; S->data[j]=S->data[j+1]; S->data[j+1]=temp;
}
}
}
printf("排序成功\n");
}
//选择排序
void list_selt_sort(seqlist *S)
{
int i,j,index;
datatype temp;
for(i=0;i<S->len;i++)
{
datatype max=S->data[i];
for(j=i;j<S->len;j++)
{
if(temp<S->data[j])
{
max=S->data[j];
index=j;
}
}
temp=S->data[i];
S->data[i]=max;
S->data[index]=temp;
}
return;
}
//去重
void list_delte_repeat(seqlist *S)
{
if(S->len<=1)
{
printf("去重失败\n");
return;
}
int index=1;
int i,j;
for(i=1;i<=S->len-1;i++)
{
for(j=0;j<index;j++)
{
if(S->data[j]==S->data[i])
{
break;
}
}
if(j==index)
{
S->data[index]=S->data[i];
index++;
}
}
S->len=index;
}
//释放表
void list_free(seqlist **S)
{
if(NULL!=*S)
{
free(*S);
}
*S=NULL;
printf("释放成功\n");
}
主函数(main.c)
#include "head.h"
int main(int argc, const char *argv[])
{
//创建顺序表
seqlist *S=list_create();
if(NULL==S)
{
puts("申请空间失败");
return -1;
}
//顺序插入数据
list_add(S,3);
list_add(S,4);
list_add(S,5);
list_add(S,6);
list_add(S,7);
//显示数据
list_show(S);
//按照位置插入数据
list_insert(S,2,6);
list_show(S);
//删除数据
list_delete(S,2);
list_show(S);
//按值查找
int res1=list_search_value(S,4);
if(res1>=0)
{
printf("第%d个位置的数据为%d\n",res1,4);
}else if(res1 == -2)
{
printf("查找失败\n");
}else if(res1 == -1)
{
printf("该表为空\n");
}
//按位置查找
list_search_pos(S,2);
//按值修改
//按位置修改
list_update_pos(S,2,10);
list_show(S);
//排序
list_sort(S);
list_show(S);
//
list_selt_sort(S);
list_show(S);
list_delte_repeat(S);
list_show(S);
list_free(&S);
list_show(S);
return 0;
}
结果: