1,为什么说线性表的顺序存储结构是一种随机存取结构?
答: 因为在线性表中每一个数据元素的存储位置都和线性表的起始位置相差一个和数据元素在线性表中的位序成正比的常数。
由此,只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取,所以线性表的顺序存储结构是一种随机存取结构
//包含头文件
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<math.h>
//函数结果和状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//Status是函数的类型,其值是函数结果状态代码
typedef int Status;
//ElemType为数据元素类型,此处定义为int类型
typedef int ElemType;
/*--------线性表的动态分配顺序存储结构--------*/
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
typedef struct
{
ElemType *elem; //存储空间基地址(为ElemType * 类型的指针变量)
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
/*--------构造一个空的线性表L-----------*/
Status InitList_Sq(SqList &L)
{
L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)
exit(OVERFLOW); //存储分配失败
L.length = 0; //若分配成功,则空表长度为0
L.listsize = LIST_INIT_SIZE;//初始存储容量
return OK;
}
/*--------顺序表的插入操作--------*/
Status Insert_Sq(SqList &L,int i,ElemType e)
{//向顺序线性表L中第i个位置之前插入新的元素e
ElemType *newbase,*p,*q;
if(i<1 || i>L.length+1)
return ERROR; //i值不合法,返回出错信息
if(L.length>=L.listsize) //当前存储空间已满,增加分配
{
newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)
exit(OVERFLOW); //存储分配失败
L.elem=newbase; //新基地址
L.listsize+=LISTINCREMENT; //增加存储容量
}
q=&(L.elem[i-1]); //q为插入位置
for(p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1)=*p; //插入位置及之后的元素后移
*q = e; //插入e
++L.length; //表长增加1
return OK;
}
/*--------顺序表的删除--------*/
Status Delete_Sq(SqList &L,int i,ElemType &e)
{//在顺序线性表L中删除第i个元素,并用e返回其值
ElemType *p,*q;
if(i<1 || i>L.length)
return ERROR; //i值不合法,返回出错信息
p = &(L.elem[i-1]); //p为被删除元素的位置
e = *p; //被删除元素的值赋给e
q = L.elem+L.length-1; //表尾元素的位置
for(++p;p<=q;++p)
*(p-1) = *p; //被删除元素之后的元素左移
--L.length;
return OK;
}
/*--------顺序表的创建--------*/
Status Creat_Sq(SqList &L)
{
ElemType temp;
printf("input Data(9999)ending\n");
scanf("%d",&temp);
while(temp!=9999)
{
Insert_Sq(L,1,temp);
printf("input Data(9999)ending\n");
scanf("%d",&temp);
}
return OK;
}
/*--------顺序表的遍历--------*/
Status Print_Sq(SqList L)
{
int i;
for(i=0;i<L.length;i++)
printf("%4d",L.elem[i]);
printf("\n");
return OK;
}
/*--------顺序表的查找----------*/
int Locate_Sq(SqList L,ElemType e)
{
int i;
int n;
ElemType *p;
p = L.elem; //p的初值为第1个元素的存储位置
for(i=1;i<L.length;i++)
{
if(*p++ == e)
n=i;
}
return n;
}
/*--------顺序表的排序--------*/
Status Sort_Sq(SqList &L)
{
int i,j;
int temp;
//ElemType *p;
//p = L.elem;
for(j=0;i<L.length;j++)
{
for(i=0;i<L.length-j;i++)
{
if(L.elem[i]>L.elem[i+1])
{
temp = L.elem[i];
L.elem[i] = L.elem[i+1];
L.elem[i+1] = temp;
}
}
}
return OK;
}
//主函数
int main()
{
ElemType e;
SqList sq1;
InitList_Sq(sq1); //调用InitList_Sq函数(构造一个空的线性表)
Creat_Sq(sq1); //调用Creat_Sq函数(创建一个线性表)
printf("Sequence List is:\n");
Print_Sq(sq1); //调用Print_Sq函数(输出线性表的元素)
e=100;
Insert_Sq(sq1,3,e); //调用Insert_Sq函数(向顺序表中插入元素)
printf("Insert result is:\n");
Print_Sq(sq1); //调用Print_Sq函数(输出插入元素后的线性表的内容)
Delete_Sq(sq1,4,e); //调用DeleteSq函数(删除线性表中指定位置的元素)
printf("Delete result is:\n");
Print_Sq(sq1); //调用Print_Sq函数(输出删除元素后的线性表的内容)
e=100;
//调用Locate_Sq函数,用来查找线性表中指定的数据元素,并输出其位置
printf("Elememt %d location:%d\n",e,Locate_Sq(sq1,e));
return 0;
Sort_Sq(sq1); //调用Sort函数,将线性表中的元素进行排序
printf("Sort result is:\n");
Print_Sq(sq1); //调用Print_Sq函数,将排序好的线性表的内容输出
return 0;
}