顺序表的基本操作
- 线性表的逻辑顺序与物理顺序一致,数据元素之间的关系是以元素在计算机内“物理位置相邻”来体现。
- 对顺序表中的所有表项,即可以进行顺序的访问,也可以随机的访问,也就是说,既可以从表的第一个表项开始逐个访问表项也可以按照表项的序号**(下标)**直接的访问。
- 无需为表示结点间的逻辑关系而增加额外的存储空间,存储利用率提高。
- 可以方便的存储表中的任一结点,存储速度快。
代码示例如下:
#include <time.h>
#include <errno.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
#include <string.h>
#include <strings.h>
#include <stdbool.h>
#include <pthread.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <dirent.h>
#define SIZE 10 //优化1 用宏定义取代数组大小
typedef int datatype;
//定义一个结构体表示顺序表
struct list
{
datatype buf[SIZE];
int last; //标记目前数组中最后一个有效成员的下标
};
//初始化顺序表
struct list *list_init()
{
struct list *mylist=malloc(sizeof(struct list));
mylist->last=-1;
return mylist;
}
//插入数据到顺序表中
int list_insert(datatype newdata,struct list *somelist)
{
//判断顺序表是否满了
if((somelist->last)>=(SIZE-1))
{
printf("顺序表满了!\n");
return -1;
}
//先更新last
(somelist->last)++;
somelist->buf[somelist->last]=newdata;
}
//删除顺序表中是数据
int list_remove(datatype deldata,struct list *somelist)
{
//判断顺序表是否空了
if(somelist->last==-1)
{
printf("顺序表空了!\n");
return -1;
}
//找到要删除的数据
int i=0;
int s=1;
for (int i = 0; i < (somelist->last)+1; i++)
{
if((somelist->buf[i])==deldata)
{
for(int j=i;j<(somelist->last)+1;j++)
{
somelist->buf[j]=somelist->buf[j+1];
}
s=0;
(somelist->last)--;
list_remove(deldata,somelist);
}
}
return s;
}
int pd(int a)
{
if(a==1)
printf("没有这个数\n");
return 0;
}
//修改数据
int list_update(int newdata,int olddata,struct list *somelist)
{
int i;
//寻找要的修改的数据olddata
for(i=0; i<=somelist->last; i++)
{
if(somelist->buf[i]==olddata)
somelist->buf[i]=newdata;
}
}
//打印
int list_show(struct list *somelist)
{
int i;
for(i=0; i<=somelist->last; i++)
printf("当前顺序表中数据是:%d\n",somelist->buf[i]);
}
主函数如下:
int main()
{
int n;
int i;
//初始化顺序表
struct list *mylist=list_init();
//插入数据
for(i=0; i<3; i++)
{
printf("请输入要插入的整数!\n");
scanf("%d",&n);
list_insert(n,mylist);
}
//打印
printf("=======插入完毕======\n");
list_show(mylist);
//删除
list_remove(55,mylist);
//打印
printf("=======删除完毕55======\n");
list_show(mylist);
//修改数据
list_update(9,8,mylist);
//打印
printf("=======修改完毕9->8======\n");
list_show(mylist);
return 0;
}