线性表的顺序存储结构

要求:利用书本上的线性表的顺序存储结构定义 #define MAXSIZE  100 //顺序表可能达到的最大长度 typedef struct{ ElemType *elem; // 存储空间基址 int length; // 当前长度 int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位) } SqList; 1)编写完成下列功能的函数: (1)初始化一个线性表; (2)在已经初始化的基础上,创建一个包含15个不大于100的正整数值的线性表(15个值由计算机随机产生); (3)将一个数x插在第i个元素前(x和i在程序运行时输入); (4)删除第i个元素(i在程序运行时输入),并在删除结束后输出删除元素的值; (5)查找给定值x是否在线性表中(x在程序运行时输入),若在输出x在线性表中第一次出现的位置,若不在就输出x不在表中的提示; (6)输出线性表中所有元素。 2)用主函数调用你所编写的函数,并在使线性表有所变化的每一步输出线性表的内容,以验证你编程序的正确性。 备注: (1)在C的头文件stdlib.h中有srand( )接受随机数的种子和rand( )产生0~RAND_MAX的一个随机整数的函数。用rand( )%100+1可以产生不大于100的正整数值。 (2)要求编一菜单,根据选项逐个调用各函数; (3)所编程序要具有一定的健壮性,即:在插入删除时要考虑表空、表满、位置是否合法等情况,当输入数据非法时,程序也能适当的做出反应,而不致于出现莫名其妙的结果。

//线性表的顺序存储结构

#include

#include

//定义常量存储空间的初始化分配

#define MAXSIZE 100//顺序表可能达到的最大长度

#define TRUE 1

#define ERROR -1

#define FALSE 0

#define OK 1

typedef int Status;

typedef int ElemType;

typedef struct{

ElemType *elem;//存储空间基址

int length;//当前长度

int listsize;//当前分配的存储容量(以sizeof(ElemType)为单位)

}SqList;

Status listEmpty(SqList L)

{

if(L.listsize==0)

{

return TRUE;

}

return FALSE;

}

//初始化线性表

Status initList(SqList *L)

{

L->elem=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));

if(!L->elem)

return ERROR;//存储分配失败

L->length=0;//初始空表长度为零

L->listsize=MAXSIZE;//初始存储容量

return OK;

}

//创建随机数线性表

Status createList(SqList *L)

{

int seed;

printf("\n");

L->length=1;

printf(" 请输入种子seed:");

scanf("%d",&seed);

srand(seed);

for(L->length;L->length<=L->listsize;L->length++)

{

L->elem[L->length-1]=rand()%100+1;

}

return OK;

}

//插入线性表数据

Status listInsert(SqList *L,int i,ElemType x)

{

//判断长度是否可以允许插入新的数据

if(L->length>=MAXSIZE)

{

printf("空间已满,不能再插入数据\n");

return FALSE;

}

//判断插入位置的合法性

if(i<1||i>L->listsize)

{

printf("插入位置不正确\n");

return FALSE;

}

for(int j=L->listsize;j>=i;j--)

{

L->elem[j]=L->elem[j-1];

}

L->elem[i-1]=x;

L->listsize++;

return TRUE;

}

//删除线性表内的数据

Status deleteList(SqList *L,int i)

{

//判断线性表是否为空

if(listEmpty(*L))

{

return ERROR;

}

//判断删除的位置是否合法

if(i<1||i>L->listsize)

{

printf("删除位置不合法\n");

return ERROR;

}

printf(" 要删除的第%d个位置上的值是%d\n",i,L->elem[i-1]);

for(i;ilistsize;i++)

{

L->elem[i-1]=L->elem[i];

}

L->listsize--;

return TRUE;

}

//查找线性表内的数据

Status locateElem(SqList L, ElemType x)

{

for(int i=0;i

{

if(L.elem[i]==x)

{

return i+1;

}

}

printf("\n没有查找到元素%d指定的下标\n",x);

return ERROR;

}

Status listTraverse(SqList L)

{

int i;

for(i=0;i

{

printf("%2d ",L.elem[i]);

}

printf("\n");

return OK;

}

int main()

{

SqList L;

ElemType x,elem;

int option=1,i;

while(option)

{

printf("\n 函数功能 \n----------------------------------\n *****************************\n *1.初始化线性表 *\n *2.随机创建线性表 *\n *3.插入线性表数据 *\n *4.删除第i个元素 *\n *5.查找线性表中是否存在定值x*\n *6.输出线性表中所有元素 *\n *7.退出程序 *\n *****************************\n\n请输入要执行的操作(1--7):");

scanf("%d",&option);

switch(option)

{

case 1:

initList(&L);

break;

case 2:

printf("\n 请输入所创建的数据个数:");

scanf("%d",&L.listsize);

if(L.listsize<=0||L.listsize>MAXSIZE)

{

printf("个数无效!!!\n");

break;

}

createList(&L);

printf("\n 创建后:");

listTraverse(L);

break;

case 3:

printf("\n 请分别输入要插入的位置i(1--%d)、数字x:",L.listsize);

scanf("%d%d",&i,&x);

if(i<=0)

{

printf("位置无效!!!\n");

break;

}

printf("\n 插入前:");

listTraverse(L);

listInsert(&L,i,x);

printf(" 插入后:");

listTraverse(L);

break;

case 4:

printf("\n 请输入要删除数字的位置i:");

scanf("%d",&i);

if(listEmpty(L))

{

printf("该表为空!");

break;

}

printf("\n 删除前:");

listTraverse(L);

deleteList(&L,i);

printf(" 删除后:");

listTraverse(L);

break;

case 5:

printf("\n 请输入要查找的数字x:");

scanf("%d",&x);

i=locateElem(L,x);

if(i!= ERROR)

{

printf("\n 值为%d的数字在第%d个位置\n",x,i);

}

break;

printf(" 线性表内的数据:");

listTraverse(L);

case 6:

printf("\n 线性表内的数据为:");

listTraverse(L);

break;

case 7:

return OK;

}

}

return 0;

}

希望能帮助到各位,欢迎大家在此交流评论。

好文推荐

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。