线性结构的特点:
表头元素没有前驱,表尾元素没有后继,中间元素有唯一前驱和唯一后继。
利用数组也是顺序存储的特点,所以可以用数组实现线性表的顺序存储。
线性表的顺序存储以下称之为顺序表,表中每个元素的地址间是连续存储的,所以可以由数组下标依次访问每个元素,即设计一个包含存储数据的数组和一个表尾指针。
因为是采用数组实现,而数组元素能通过下标访问,所以表尾指针不用定义成指针类型,而是一个整型变量即可,表尾指针的作用是来指明表内当前存储的有效数据个数,便于对表的判断空表、判断表满、添加数据、删除数据等操作。
所以整张表可由一个结构体表示
#define N 100
typedef int data_t //可以改为任意类型的数据进行存储,本文设为存储int型数据
typedef struct seqlist{
data_t buf[N]; //定义表的大小
int last; //定义表尾指针
}SeqList;
头文件:
/*===============================================
* 文件名称:seqlist.h
* 创 建 者: xm
* 创建日期:2022年07月27日
* 描 述::
================================================*/
#ifndef _SEQLIST_
#define _SEQLIST_
#include <stdlib.h>
#define N 64
typedef int data_t;
typedef struct{
data_t buf[N];//定义表长
int last;//定义表尾指针
}SeqList;
SeqList *Create_Seqlist();//创建表
int SeqList_Length(SeqList *seq);//求表长
void SeqList_Insert_Pos(SeqList *seq,int pos,int data);//插入表
void Show_SeqList(SeqList *seq);//打印表
int SeqList_Is_Full(SeqList *seq);//判满
int SeqList_is_Empty(SeqList *seq);//判空
void SeqList_Delete_Pos(SeqList *seq,int pos);//按位置删除
void SeqList_Delete_Val(SeqList *seq,int value);//按值>删除
int SeqList_Find_Pos(SeqList *seq,int pos);//按位置查找
int SeqList_Find_Val(SeqList *seq,int value);//按值查找
void SeqList_Empty_List(SeqList *seq);//清空表
void SeqList_change(SeqList *seq,int pos,int value);//按位置修改
#endif
功能函数文件:
/*===============================================
* 文件名称:line_list.c
* 创 建 者: xm
* 创建日期:2022年07月27日
* 描 述:
================================================*/
#include <stdio.h>
#include <stdlib.h>
#include "seqlist.h"
#include <string.h>
//创建表
SeqList *Create_Seqlist()
{
SeqList *seq = (SeqList *)malloc(sizeof(SeqList));
if(seq == NULL){//申请空间失败
printf("malloc ERROR!\n");
return NULL;
}
//初始化数组内容
//从 首地址 开始, sizeof() 个字节全部置 0
memset(seq->buf,0,sizeof(seq->buf));
seq->last = -1; //表尾指针初始化
return seq;
}
int SeqList_Is_Full(SeqList *seq)
{
if(seq->last ==N-1)return 1;//表满返回1
else return 0;
}
int SeqList_is_Empty(SeqList *seq)
{
if(seq->last==-1)return 0;//表空返回0
else return 1;
}
int SeqList_Length(SeqList *seq)//求表长
{
return seq->last;
}
void SeqList_Insert_Pos(SeqList *seq,int pos,int data)//插入
{
if(seq->last != -1)//避免空表时插入出错
{
if(pos<0 || (pos > seq->last))
{
printf("位置错误\n");
return;
}
}
if(SeqList_Is_Full(seq)==1)//判满
{
printf("表满\n");
return ;
}
int i=0;
for(i=seq->last;i>=pos;i--)
{
seq->buf[i+1]=seq->buf[i];
}
seq->buf[pos]=data;
seq->last++;
}
void Show_SeqList(SeqList *seq)//打印表
{
int i;
if(SeqList_is_Empty(seq)==0)
{
printf("表为空\n");
return ;
}
for(i=0;i<=seq->last;i++)
{
printf("buf[%d]=%d\n",i,seq->buf[i]);
}
puts("");
}
void SeqList_Delete_Pos(SeqList *seq,int pos)//按位置删除
{
if(SeqList_is_Empty(seq)==0)
{
printf("表为空,无法删除\n");
return;
}
if(pos<0 || pos>seq->last)
{
printf("位置错误\n");
return;
}
int i;
for(i=pos;i<seq->last;i++)
{
seq->buf[i]=seq->buf[i+1];
}
seq->buf[i]=0;
seq->last--;
}
void SeqList_Delete_Val(SeqList *seq,int value)//按值>删除
{
if(SeqList_is_Empty(seq)==0)
{
printf("表为空,无法删除\n");
return;
}
int i,j;
for(i=0;i<=seq->last;i++)
{
if(seq->buf[i]==value)
{
for(j=i;j<(seq->last);j++)
{
seq->buf[j]=seq->buf[j+1];
}
seq->buf[j]=0;
seq->last--;
i--;
}
}
}
int SeqList_Find_Pos(SeqList *seq,int pos)//按位置查找
{
if(SeqList_is_Empty(seq)==0)
{
printf("表为空\n");
return -1;
}
if(pos<0 || pos>seq->last)
{
printf("位置错误\n");
return -1;
}
return seq->buf[pos];
}
int SeqList_Find_Val(SeqList *seq,int value)//按值查找
{
if(SeqList_is_Empty(seq)==0)
{
printf("表为空\n");
return -1;
}
int i=0;
while(seq->buf[i]!=value)i++;
return i;
}
void SeqList_change(SeqList *seq,int pos,int value)//按位置修改
{
if(SeqList_is_Empty(seq)==0)
{
printf("表为空\n");
return ;
}
if(pos<0 || pos>seq->last)
{
printf("位置错误\n");
return ;
}
seq->buf[pos]=value;
}
void SeqList_Empty_List(SeqList *seq)//清空表
{
seq->last=-1;
}
主函数文件:
/*===============================================
* 文件名称:main.c
* 创 建 者:
* 创建日期:2022年07月27日
* 描 述:
================================================*/
#include <stdio.h>
#include "seqlist.h"
int main(int argc, char *argv[])
{
/* int n=10;
while(n--)//头插法
{
SeqList_Insert_Pos(seq,0,n);
}
Show_SeqList(seq);//打印表
*/
SeqList *seq;
int mode=0,pos=-1,data=-1;
while(1)
{
printf("-----------功能列表-----------\n");
printf("1.创建表 2.插入数据 3.打印表 4.按位置删除数据 5.按数据值删除\n 6.按位置查找数据 7.按值查找 8.按位置修改数据 9.清空表 10.退出程序\n");
scanf("%d",&mode);
getchar();
switch(mode)
{
case 1:seq=Create_Seqlist();puts("创建成功");
break;
case 2:puts("输入要插入的位置和数据");
scanf("%d%d",&pos,&data);
printf("pos=%d,data=%d\n",pos,data);
SeqList_Insert_Pos(seq,pos,data);
break;
case 3:Show_SeqList(seq);
break;
case 4:puts("输入要删除的位置");
scanf("%d",&pos);
printf("pos=%d,data=%d\n",pos,data);
SeqList_Delete_Pos(seq,pos);
break;
case 5:puts("输入要删除的数据值");
scanf("%d",&data);
printf("pos=%d,data=%d\n",pos,data);
SeqList_Delete_Val(seq,data);
break;
case 6:puts("输入要查找的位置");
scanf("%d",&pos);
printf("pos=%d,data=%d\n",pos,data);
printf("buf[%d]=%d\n",pos,SeqList_Find_Pos(seq,pos));
break;
case 7:puts("输入要查找的数据值");
scanf("%d",&data);
printf("pos=%d,data=%d\n",pos,data);
printf("buf[%d]=%d\n",SeqList_Find_Val(seq,data),data);
break;
case 8:puts("输入要修改的位置以及新数据");
scanf("%d%d",&pos,&data);
printf("pos=%d,data=%d\n",pos,data);
SeqList_change(seq,pos,data);
printf("修改后buf[%d]=%d\n",pos,seq->buf[pos]);
break;
case 9:SeqList_Empty_List(seq);
printf("清空表完成");
break;
case 10:return 0;
default:
puts("输入错误\n");
}
}
free(seq);
seq=NULL;
return 0;
}
顺序表
优点:数据查找和修改比较方便
缺点:浪费资源空间,插入和删除数据效率低,且不能适应动态变化