记录学习数据结构书籍<<大话数据结构>>的学习笔记。
线性表的顺序存储结构:用一段地址连续的存储单元依次存储线性表的数据元素
#include "stdio.h"
#define MAXSIZE 20
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int ElemType;
/*对应结构体的定义*/
typedef struct
{
ElemType data[MAXSIZE];
int length;
}SqList;
/*获取线性表中的第i个元素*/
/*用e返回L中的第i个元素的值*/
Status GetElem(SqList L,int i,ElemType *e)
{
if(L.length==0 || i<1 || i>L.length)
{
return ERROR;
}
*e=L.data[i-1];
return OK;
}
/*在L中第i个位置之前插入新的元素e,L的长度为1*/
Status ListInsert(SqList *L,int i,ElemType e)
{
int k;
if (L->length==MAXSIZE) /*顺序线性表已经满*/
{
return ERROR;
}
if(i<1 || i>L->length+1) /*i不在范围内*/
{
return ERROR;
}
if(i<=L->length) /*插入数据位置不在表尾部*/
{
for(k=L->length-1;k>=i-1;k--) /*将要插入位置后的数据元素向后移动一位*/
{
L->data[k+1]=L->data[k];
}
}
L->data[i-1]=e; /*将新元素插入*/
L->length++;
return OK;
}
/*删除第i个数据元素,并用e返回其值,L的长度减1*/
Status ListDelete(SqList *L,int i,ElemType *e)
{
int k;
if(L->length==0) /*线性表为空*/
{
return ERROR;
}
if(i<1||i>L->length) /*需要删除的位置不对*/
{
return ERROR;
}
*e=L->data[i-1]; /*记录需要删除元素*/
if(i<L->length) /*需要删除的元素不是最后一位*/
{
for(k=i;k<L->length;k++) /*后面的元素依次向前移动*/
{
L->data[k-1]=L->data[k];
}
}
L->length--;
return OK;
}
/*遍历所有元素*/
void ListErgodic(SqList *L)
{
int len=0;
len = L->length;
for(len=0;len<=L->length-1;len++)
{
printf("第%d个元素是%d\r\n",len,L->data[len]);
}
}
/*测试案例*/
void main(void)
{
SqList Q;
int number;
ListInsert(&Q,1,23); //插入一个元素
ListInsert(&Q,1,22); //插入一个元素
ListInsert(&Q,2,21); //插入一个元素
ListErgodic(&Q); //遍历所有元素
printf("当前的长度为%d\r\n",Q.length);
ListDelete(&Q,2,&number); //删除第2个元素
printf("当前的长度为%d\r\n",Q.length);
printf("删除的元素是%d\r\n",number);
}
运行测试输出结果打印
线性表的顺序存储结构的优缺点:
优点:
1.可以快速存取表中任意位置的元素。
2.无需为表示表中元素之间的逻辑关系而增加额外的存储空间。
缺点:
1.插入和删除元素时,需要进行大量的数据移动操作。
2.当线性表长度变化较大时,难以确定存储空间的容量。