实现工具:dev
顺序表功能:
创建一个空的线性表;
在线性表中插入元素;
在线性表中删除元素;
在线性表中查找元素;
代码:(详解请看注释)
#include<stdio.h>
#include<stdlib.h>//动态分配需要的头文件
#define LIST_INIT_SIZE 100
#define LISTNCREAMENT 10
#define OK 1
#define FALSE 0
#define OVERFLOW 2//溢出
typedef float ElemType;
typedef int Status;
//线性表动态分配内存的顺序存储结构
typedef struct
{
ElemType *elem;//存储的基地址
int length;//当前长度
int listsize;//当前分配的最大容量
}SqList;
ElemType * p,* q,e;//注意,e要定义为全局变量
ElemType * newbase;//若存储不够的话,新分配的基地址
//创建线性表 (空表)
Status InitList_Sq(SqList &L)
{
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));//为顺序表分配一片连续的存储空间
L.length=0;//初始化当前长度
L.listsize=LIST_INIT_SIZE;//初始化当前最大容量
return OK;
}
//线性表的插入
Status ListInsert_Sq(SqList &L,int i,ElemType e)
{
if(i<1||i>L.length+1)//注意长度+1
{
return FALSE;
}
if(L.length>L.listsize)//若长度超过了当前最大容量,则需要新开辟空间
{
//realloc的使用
newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTNCREAMENT)*sizeof(ElemType));
if(!newbase)//判断新空间是否开辟
{
exit(OVERFLOW);
}
L.elem=newbase;//将结构体中的数据更新
L.listsize+=LISTNCREAMENT;
}
q=&(L.elem[i-1]);//p指向的是第i个元素
for(p=&L.elem[L.length-1];p>=q;--p)
//插入时,需要从最后一个元素开始往后挪
//p指向的是数据中的最后一个元素,其中第i个元素也要进行挪位
{
*(p+1)=*p;
}
*q=e;//将插入的元素e插入进去
++L.length;//顺序表的长度加一
return OK;
}
//删除操作
ElemType ListDelete_Sq(SqList &L,int i, ElemType &e)
{
if(i<1||i>L.length)//注意边界
{
return FALSE;
}
p=&L.elem[i-1];//p是要删除的第i个元素
e=*p;//将删除的元素赋值给e
q=L.elem+L.length-1;//表尾元素的位置
for(++p;p<=q;++p)//将元素往前移动
{
*(p-1)=*p;
}
--L.length;//长度减一
return e;
}
//查找
int LocateElem_Sq(SqList L,ElemType e)
{
int i;
i=1;
while(i<=L.length&&L.elem[i-1]!=e)
{
++i;
}
if(i<L.length)
{
return i;
}
else return FALSE;
}
int main()
{
Status i,j;
SqList La;
//创建空表
InitList_Sq(La);
//将表赋值为1 2 3 4 5
for(i=1;i<=5;i++)
{
ListInsert_Sq(La,i,i);
}
//输出顺序表
for(i=0;i<5;i++)
{
printf("%f ",La.elem[i]);
}
printf("\n");
//在顺序表的第二个位置插入11
ListInsert_Sq(La,2,11);
//输出新表
for(i=0;i<La.length;i++)
{
printf("%f ",La.elem[i]);
}
printf("\n");
//删除顺序表的第4个元素
ListDelete_Sq(La,4,e);
for(i=0;i<La.length;i++)
{
printf("%f ",La.elem[i]);
}
printf("\n");
//查找顺序表中元素11,并返回其位置
j=LocateElem_Sq(La,11);
printf("%d ",j);
return 0;
}