顺序表的各种操作
顺序表的操作包括增删改查,细分出来包括:
创建一个空的顺序表
向顺序表中插入数据
遍历并打印数据
判断顺序表是否为空
判断顺序表是否为满
删除顺序表中数据并返回数据
根据数据修改数据
根据位置修改数据
根据位置查找数据
根据数据查找位置
一、本程序的各种函数操作
头文件和全局变量声明
#include<stdlib.h>
#include<stdio.h>
#include<stdbool.h>
#define N 128
typedef int datatype; //重定义
typedef struct //定义一个结构体
{
datatype data[N];
int last;
}seqlist;
创建一个空的顺序表
//创建一个空的顺序表
seqlist *seqlistCreate()
{
seqlist *s = (seqlist*)malloc(size(seqlist));
s->last = -1;
return s;
}
//创建结构体时要考虑到内存的存储位置
//如果存储在栈区,函数结束后,内存被释放,无法在主函数中对顺序表进行后续的操作 —— 不可行,不可取
//如果存储在静态区,主函数结束,内存才被释放,可以在主函数中对顺序表进行后续的操作,但会造成一定的资源浪费 —— 可行,不可取
//如果存储在堆区,由程序员自主申请,自主释放,可以在主函数中对顺序表进行后续的操作 —— 可行,可取
向顺序表中插入数据
//向顺序表中插入数据
void seqlistInsert(seqlist *s,datatype)
{
//判断是否为满
if(seqlistlsFull(s))
{
printf("本顺序表以满\n");
return ;
}
//last自增
s->last++;
//插入数据到last的位置
s->data[s->last]=value;
return;
}
遍历并打印数据
//打印顺序表里数据
void seqlistPrint(seqlist *s)
{
int i=0;
for(i=0;i<=s->last;i++)
{
printf("%d",s->data[i]);
}
putcahr(10);
return;
}
判断顺序表是否为空
//判断顺序表是否为空
bool seqlistIsEmpty(seqlist *s)
{
if(s->last<0)
{
return true;
}
else
{
return false;
}
//return s->last<0?true:false;//三目运算符
}
判断顺序表是否为满
//判断顺序表是否为满
bool seqlistIsEmpty(seqlist *s)
{
if(s->last==N-1)
{
return true;
}
else
{
return false;
}
//return s->last==N-1?true:false;//三目运算符
}
删除顺序表中数据并返回数据
//删除顺序表中数据并返回数据在主函数打印删除的数
datatype seqlistDelete(seqlist *s)
{
//如果顺序表为空,就不执行后续操作
if(seqlistIsEmpty(s))
{
printf("这个顺序表是空的\n");
return (datatype)-1;
}
//用del临时存放将要删除的数据
datatype del = s->data[s->last];
//last自减,删除(不访问的)数据
s->last--;
return del;
}
根据数据修改数据
//根据数据修改数据
void seqlistModifyDataByData(seqlist *s,datatype oldValue,datatype newValue)
{
int i = 0;
bool iFind = false;
if(seqlistEmpty(s))
{
printf("这个顺序表是空的");
return;
}
for(i=0;i<=s->last;i++)
{
if(s->data[i]==oldValue)
{
s->data[i] = newValue;
iFind = true;
}
}
if(!iFind)
{
printf("所需的数值未查找到");
}
return;
}
根据位置修改数据
//根据位置修改数据
void seqlistModifyDataByPos(seqlist *s,int pos,datatype newValue)
{
int i = 0;
bool iFind = false;
if(seqlistEmpty(s))
{
printf("这个顺序表是空的");
return;
}
for(i=0;i<=last;i++)
{
if(i==pos)
{
s->data[i] = newValue;
iFind = true;
}
}
if(!iFind)
{
printf("所需的数值未查找到");
}
return;
}
根据位置查找数据
datatype seqlistSearchDataByPos(seqlist *s, int pos)
{
if(seqlistIsEmpty(s)){
printf("本顺序表为空\n");
return (datatype)-1;
}
if(pos < 0 || pos > s->last){
printf("the pos you choosed(%d) is invalid\n", pos);
return (datatype)-1;
}
return s->data[pos];
}//在主函数中接收改函数返回的数据值。
根据数据查找(第一个)数据的位置
int seqlistSearchPosByData(seqlist *s, datatype value){
int i = 0;
if(seqlistIsEmpty(s)){
printf("the seqlist is empty\n");
return -1;
}
for(i = 0; i <= s->last; i++){
if(s->data[i] == value){
return i;
}
}
printf("the data you choosed(%d) is not exist\n", value);
return -1;
}
在一个位置插入一个数
void seqlistlnsertbyPos(seqlist *s,int pos,datatype value)
{
if(pos<0||pos>s->last+1)
{
printf("位置不合理\n");
return ;
}
int i;
for(i=s->last;i>=pos;i--)
{
s->data[i+1] = s->data[i];
}
s->data[pos]=value;
s->last++;
return;
}
13.删除某个位置的数,并返回这个数
datatype seqlistDeletetbyPos(seqlist *s,int pos)
{
if(pos < 0 || pos > N)
{
printf("位置不合理\n");
return (datatype)-1;
}
int i;
datatype del = s->data[pos];
for(i=pos;i<=s->last;i++)
{
s->data[i] = s->data[i+1];
}
s->last--;
return del;
}
二、运行(在一个程序中)
#include<stdlib.h>
#include<stdio.h>
#include<stdbool.h>
#define N 128
typedef int datatype;
typedef struct
{
datatype data[N];
int last;
}seqlist;
seqlist *seqlistCreate();
void seqlistlnsert(seqlist *s, datatype value);
void seqlistPrint(seqlist*s);
datatype seqlistDelete(seqlist*s);
bool seqlistIsEmpty(seqlist *s);
bool seqlistIsFull(seqlist *s);
void seqlistModifyDataByData(seqlist *s,datatype oldValue,datatype newValue);
void seqlistModifyDataByPos(seqlist *s,int pos,datatype newValue);
void seqlistFindbyPos(seqlist *s,int pos);
void seqlistFindbyData(seqlist *s,datatype value);
void seqlistlnsertbyPos(seqlist *s,int pos,datatype value);
datatype seqlistDeletetbyPos(seqlist *s,int pos);
seqlist *seqlistCreate()
{
seqlist *s = (seqlist*)malloc(sizeof(seqlist));
s->last = -1;
return s;
}
void seqlistlnsert(seqlist *s, datatype value)
{
s->last++;
s->data[s->last]=value;
return;
}
void seqlistPrint(seqlist*s)
{
int i=0;
for (int i=0 ; i <= s->last; i++)
{
printf("%d ",s->data[i]);
}
putchar(10);
return;
}
datatype seqlistDelete(seqlist*s)
{
if(seqlistIsEmpty(s))
{
printf("该文件为空\n");
return (datatype)-1;
}
datatype del = s -> data[s->last];
s->last--;
return del;
}
bool seqlistIsEmpty(seqlist *s)
{
if(s->last<0)
{
return true;
}
else
{
return false;
}
//return s->last <0?true:false;//三目运算符
}
bool seqlistIsFull(seqlist *s)
{
if(s->last<N-1)
{
return true;
}
else
{
return false;
}
//return s->last <N-1?true:false;//三目运算符
}
void seqlistModifyDataByData(seqlist *s,datatype oldValue,datatype newValue)
{
int i;
bool iFind = false;
if(seqlistIsEmpty(s))
{
printf("该文件为空\n");
return ;
}
for(i=0;i<=s->last;i++)
{
if(s->data[i] == oldValue)
{
s->data[i] = newValue;
iFind = true;
}
}
if (!iFind)
{
printf("这个数据(%d)没有找到",oldValue);
}
return;
}
//根据位置修改
void seqlistModifyDataByPos(seqlist *s,int pos,datatype newValue)
{
int i;
bool iFind = false;
if(seqlistIsEmpty(s))
{
printf("该文件为空\n");
return ;
}
if(pos<0||pos>128)
{
printf("位置不合理\n");
return ;
}
for(i=0;i<=s->last;i++)
{
if(i==pos)
{
s->data[i] = newValue;
iFind = true;
}
}
if (!iFind)
{
printf("这个位置(%d)没有找到",pos);
}
return;
}
//根据位置查找数据
void seqlistFindbyPos(seqlist *s,int pos)
{
int i;
bool flag = false;
if(pos<0||pos>128)
{
printf("位置不合理\n");
return ;
}
for(i=0;i<=s->last;i++)
{
if(i==pos)
{
printf("下标为%d的数值为:%d\n",pos,s->data[i]);
flag=true;
}
}
if (!flag)
{
printf("这个位置(%d)没有找到\n",pos);
}
return;
}
//根据数据查找位置
void seqlistFindbyData(seqlist *s,datatype value)
{
int i;
bool iFind = false;
for(i=0;i<=s->last;i++)
{
if(s->data[i]==value)
{
printf("数值%d的下标为:%d\n",value,i);
iFind=true;
}
}
if (!iFind)
{
printf("这个数值(%d)没有找到\n",value);
}
return;
}
//在顺序表之间添加数据
void seqlistlnsertbyPos(seqlist *s,int pos,datatype value)
{
if(pos<0||pos>s->last+1)
{
printf("位置不合理\n");
return ;
}
int i;
for(i=s->last;i>=pos;i--)
{
s->data[i+1] = s->data[i];
}
s->data[pos]=value;
s->last++;
return;
}
//在顺序表之间按下标删除数据
datatype seqlistDeletetbyPos(seqlist *s,int pos)
{
printf("位置不合理\n");
if(pos < 0 || pos > (s->last+1))
{
printf("位置不合理\n");
return (datatype)-1;
}
int i;
datatype del = s->data[pos];
for(i=pos;i<=s->last;i++)
{
s->data[i] = s->data[i+1];
}
s->last--;
return del;
}
int main(int argc, char const *argv[])
{
seqlist *s = seqlistCreate();
seqlistlnsert(s,123);
seqlistlnsert(s,126);
seqlistlnsert(s,1);
seqlistlnsert(s,16);
seqlistlnsert(s,500);
//seqlistPrint(s);
// seqlistDelete(s);
//printf("删除的数据为:%d\n",seqlistDelete(s));
//seqlistModifyDataByData(s,1,126);
// seqlistModifyDataByPos(s,3,999);
//seqlistFindbyPos(s,2);
//seqlistFindbyData(s,126);
seqlistPrint(s);
seqlistlnsertbyPos(s,3,1000);
seqlistPrint(s);
printf("%d\n",seqlistDeletetbyPos(s,2));
seqlistPrint(s);
free(s);
return 0;
}
三、分文件编译
//seqlist.c
#include "seqlist.h"
//
seqlist *seqlistCreate()
{
seqlist*s = (seqlist*) malloc(sizeof(seqlist));
s->last = -1;
return s;
}
//
void seqlistlnsert(seqlist *s, datatype value)
{
s->last++;
s->data[s->last]=value;
return;
}
//
void seqlistPrint(seqlist*s)
{
for(int i=0;i<=s->last;i++)
{
printf("%d ",s->data[i]);
}
printf("\n");
return ;
}
//
bool seqlistIsFull(seqlist *s)
{
if(s->last==N-1)
{
return true;
}
else
{
return false;
}
}
//
bool seqlistIsEmpty(seqlist *s)
{
if(s->last<0)
{
return true;
}
else
{
return false;
}
}
//
datatype seqlistDelete(seqlist*s)
{
//判断是否为空
if(seqlistIsEmpty(s))
{
printf("该文件为空");
return (datatype)-1;
}
datatype del = s -> data[s->last];
s->last--;
return del;
}
//
void seqlistModifyDataByData(seqlist *s,datatype oldValue,datatype newValue)
{
int i = 0;
bool flag = false;
if(seqlistIsEmpty(s))
{
printf("该文件为空");
return ;
}
for(i=0;i<=s->last;i++)
{
if(s->data[i] == oldValue)
{
s->data[i] = newValue;
flag = true;
}
}
if(!flag)
{
printf("为查找到该数值\n");
}
return;
}
//
void seqlistModifyDataByPos(seqlist *s,int pos,datatype newValue)
{
int i = 0;
bool flag = false;
if(seqlistIsEmpty(s))
{
printf("该文件为空");
return ;
}
if(pos>128||pos<0)
{
printf("该输入不合法\n");
return;
}
for(;i<=s->last;i++)
{
if(i== pos)
{
s->data[i] = newValue;
flag = true;
}
}
if(!flag)
{
printf("为查找到该数值\n");
}
return;
}
//
datatype seqlistFindbyPos(seqlist *s,int pos)
{
if(pos>128||pos<0)
{
printf("该输入不合法\n");
return -1;
}
return s->data[pos];
}
//
datatype seqlistFindbyData(seqlist *s,int value)
{
bool flag = false;
for(int i=0;i<s->last;i++)
{
if(s->data[i]==value)
{
return i;
flag = true;
}
}
if (!flag)
{
printf("未查找到该下标");
}
return (datatype)-1;
}
//
void seqlistlnsertbyPos(seqlist *s,int pos,datatype value)
{
if(pos<0||pos>s->last+1)
{
printf("位置不合理\n");
return ;
}
int i;
for(i=s->last;i>=pos;i--)
{
s->data[i+1] = s->data[i];
}
s->data[pos]=value;
s->last++;
return;
}
//
datatype seqlistDeletetbyPos(seqlist *s,int pos)
{
if(pos < 0 || pos > N)
{
printf("位置不合理\n");
return (datatype)-1;
}
int i;
datatype del = s->data[pos];
for(i=pos;i<=s->last;i++)
{
s->data[i] = s->data[i+1];
}
s->last--;
return del;
}
//seqlist.h
#ifndef __FUN_H__
#define __FUN_H__
#include<stdlib.h>
#include<stdio.h>
#include<stdbool.h>
#define N 128
typedef int datatype;
typedef struct
{
datatype data[N];
int last;
}seqlist;
//函数的声明
seqlist *seqlistCreate();
void seqlistlnsert(seqlist *s, datatype value);
void seqlistPrint(seqlist*s);
datatype seqlistDelete(seqlist*s);
bool seqlistIsEmpty(seqlist *s);
bool seqlistIsFull(seqlist *s);
void seqlistModifyDataByData(seqlist *s,datatype oldValue,datatype newValue);
void seqlistModifyDataByPos(seqlist *s,int pos,datatype newValue);
datatype seqlistFindbyPos(seqlist *s,int pos);
datatype seqlistFindbyData(seqlist *s,int value);
datatype seqlistDeletetbyPos(seqlist *s,int pos);
void seqlistlnsertbyPos(seqlist *s,int pos,datatype value);
#endif
//main.c
#include"seqlist.h"
int main(int argc, char const *argv[])
{
datatype s = seqlistCreate();
seqlistlnsert(s,1);
seqlistlnsert(s,3);
seqlistlnsert(s,9);
seqlistlnsert(s,12);
seqlistlnsert(s,76);
seqlistlnsert(s,29);
seqlistPrint(s);
putchar(10);
printf("%d\n",seqlistDelete(s));
seqlistPrint(s);
printf("*********************************\n");
seqlistModifyDataByData(s,9,66666);
seqlistPrint(s);
seqlistModifyDataByPos(s,1,77777);
seqlistPrint(s);
printf("*********************************\n");
printf("%d\n",seqlistFindbyPos(s,3));
printf("%d\n",seqlistFindbyData(s,1));
printf("*********************************\n");
seqlistlnsertbyPos(s,1,199);
seqlistPrint(s);
printf("%d\n",seqlistDeletetbyPos(s,0));
seqlistPrint(s);
free(s);
return 0;
}
//Makefile
OBJ=seqlist
${OBJ}:${OBJ}.o main.o
%*.o:%*.c
.PHONY:clean
clean:
${RM} *.o ${OBJ}
四、运行结果
![](https://i-blog.csdnimg.cn/blog_migrate/6bdec6fed3d850738cc3c7ce24dac87d.png)