线性表
-
顺序表中的数据元素的存储地址是其序号的线性函数,只要确定了存储顺序表的起始地址(即基地址),计算任意一个元素的存储地址的时间是相等的,具有这一特点的存储结构称为随机存取结构。
-
通常用一维数组来实现顺序表,也就是把线性表中相邻的元素存储在数组中相邻的位置,从而导致了数据元素的序号和存放他的数组下标之间具有一一对应关系。
-
顺序表示静态存储分配,在其变量推出作用域时自动释放该变量所占内存单元,因此,顺序表无需销毁。
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
typedef int DataType;
typedef struct
{
DataType data [MaxSize];
int length;
}SeqList;
void Initlist (SeqList *L);
int CreatList(SeqList *L,DataType a[],int n);
int Empty(SeqList*L);
int Length(SeqList *L);
void PrintList(SeqList *L);
int Locate(SeqList *L,DataType x);
int Delete(SeqList *L,int i,DataType*ptr);
int Get(SeqList *L,int i,DataType*ptr);
int Insert( SeqList *L,int i,DataType x);
int Delete(SeqList *L,int i,DataType*ptr);
int main()
{
int r[30],i,x,num,m,n;
SeqList L;
printf("请输入列表数字的数量:\n");
scanf("%d",&num);
printf("请输入%d个数字作为列表:\n",num);
for(i=0;i<num;i++)
{
scanf("%d",&r[i]);
}
CreatList(&L,r,num);
printf("当前线性表的数据为:\n");
PrintList(&L);
printf("\n");
printf("请输入要插入的位置和数字\n");
scanf("%d %d",&m,&n);
Insert(&L,m,n);
printf("执行插入操作后数据为:\n");
PrintList(&L);
printf("\n");
printf("当前线性表的长度为:%d\n",Length(&L));
printf("请输入查找的元素值:\n");
scanf("%d",&x);
printf("元素%d的位置为:\n",x);
Locate(&L,x);
printf("\n");
printf("请输入查找第几个元素值:\n");
scanf("%d",&i);
if(Get(&L,i,&x)==1)printf("第%d个元素值是%d\n",i,x);
else printf("线性表中没有第%d个元素\n",i);
printf("请输入要删除第几个元素:\n");
scanf("%d",&i);
if(Delete(&L,i,&x)==1){
printf("删除第%d个元素是%d,删除后数据为:\n",i,x);
PrintList(&L);
}
else printf("删除操作失败\n");
return 0;
}
void Initlist (SeqList *L)//初始化列表
{
L->length=0;
}
int CreatList(SeqList *L,DataType a[],int n)//建立顺序表
{
if(n>MaxSize){printf("顺序表的空间不够,无法建立顺序表\n");return 0;}
for (int i=0;i<n;i++)
L->data[i]=a[i];
L->length=n;
return 1;
}
int Empty(SeqList*L)//判空操作
{
if(L->length==0)return 1;
else return 0;
}
int Length(SeqList *L)//求长度
{
return L->length;
}
void PrintList(SeqList *L)//遍历操作
{
for(int i=0;i<L->length;i++)
printf("%d ",L->data[i]);
}
int Locate(SeqList *L,DataType x)//按值查找
{
int j=0,k;int m[30];
for(int i=0;i<L->length;i++)
{
if(L->data[i]==x){
m[j]=i+1;
j++;}
}
if(j!=0){
for(k=0;k<j;k++)
printf("%d ",m[k]);
}
else printf("查找失败\n");
return 0;
}
int Get(SeqList *L,int i,DataType*ptr)//按位查找
{
if(i<1||i>L->length){printf("查找位置非法,查找失败\n");return 0;}
else {*ptr=L->data[i-1];return 1;}
}
int Insert( SeqList *L,int i,DataType x)//插入操作
{
if(L->length>=MaxSize){printf("上溢错误,插入失败\n");return 0;}
for(int j=L->length;j>=i;j--)
L->data[j]=L->data[j-1];
L->data[i-1]=x;
L->length++;‘
return 1;
}
int Delete(SeqList *L,int i,DataType*ptr) //删除操作
{
if(L->length==0){printf("下溢错误,删除失败\n");return 0;}
if(i<1||i>L->length){printf("查找位置非法,查找失败\n");return 0;}
*ptr=L->data[i-1];
for(int j=i;j<L->length;j++)
L->data[j-1]=L->data[j];
L->length--;
return 1;
}
通过本程序可以对线性表进行基本的一系列操作。
该程序在Dev-C++中打开过,确保通过编译并可执行。
下图为.exe文件的执行情况。