线性表的顺序存储结构
要求:利用书本上的线性表的顺序存储结构定义
#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)所编程序要具有一定的健壮性,即:在插入删除时要考虑表空、表满、位置是否合法等情况,当输入数据非法时,程序也能适当的做出反应,而不致于出现莫名其妙的结果。文章来源:https://www.toymoban.com/news/detail-861370.html
//线性表的顺序存储结构
#include<stdio.h>
#include<stdlib.h>
//定义常量存储空间的初始化分配
#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->listsize;i++)
{
L->elem[i-1]=L->elem[i];
}
L->listsize--;
return TRUE;
}
//查找线性表内的数据
Status locateElem(SqList L, ElemType x)
{
for(int i=0;i<L.listsize;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<L.listsize;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;
}
希望能帮助到各位,欢迎大家在此交流评论。文章来源地址https://www.toymoban.com/news/detail-861370.html
到了这里,关于【数据结构】(顺序表)C语言实现线性表顺序存储的创建、插入、删除、查找、输出等基本操作(附完整代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!