线性表的顺序存储结构
要求:利用书本上的线性表的顺序存储结构定义 #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;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; } 希望能帮助到各位,欢迎大家在此交流评论。 好文推荐
发表评论