0
点赞
收藏
分享

微信扫一扫

线性表的顺序存储结构及操作的实现

ixiaoyang8 2022-01-05 阅读 129
数据结构

要求:利用书本上的线性表的顺序存储结构定义:

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)所编程序要具有一定的健壮性,即:在插入删除时要考虑表空、表满、位置是否合法等情况,当输入数据非法时,程序也能适当的做出反应,而不致于出现莫名其妙的结果。

步骤:

1.初始化一个线性表;

2.使用srand( )接受随机数的种子和rand( )随机产生包含15个不大于100的正整数值的线性表,输出线性表的值使操作者观察此步是否完成;

3.将所插入数x和插入位置i传入函数中,并判断插入位置i是否合法,若合法将i以后的数字全部后移一位,把位置空给x,使数字x插入到未知i中,若不合法则报错;

4.将所删除的位置i传入函数中,先判断i是否合法,若合法则将位置i以后的所有元素前移一位,以达到删除的目的,再将删除数字赋给一未知数并输出,若不合法则报错;

5.从线性表第一个数字起逐个后移并查找是否与给定值x相等,若相等则在线性表中(x在程序运行时输入),并输出x在线性表中第一次出现的位置,若不在输出x不在表中;

6.利用for循环逐个输出线性表中所有元素。

7.编写一菜单,便于使用者根据选项调用各函数执行

8.使用switch()执行使用者的操作。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#define   TRUE         1
#define   FALSE        0
#define   OK           1
#define   ERROR        0
#define   OVERFLOW     -2
#define   MAXSIZE      100
typedef int ElemType;
typedef int Status;
typedef struct SQLIST{
    ElemType *elem;
    int length;
}SqList;

Status InitList(SqList &L)
{
    L.elem=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));
    if(!L.elem) return ERROR;
    L.length=0;
    return OK;
}//创建初始线性表
Status ValueList(SqList &L)
{
    srand(time(0));
    for(int i=0;i<15;i++)
    {
        L.elem[i]=rand()%100+1;
        L.length+=1;
    }
    printf("线性表中元素为:");
    for(int i=0;i<L.length;i++)
    {
        printf("%4d",L.elem[i]);
    }
    printf("\n");
    return OK;
}//赋值初始线性表
Status InsertList(SqList &L,int i,int x)
{
    if(i<1||i>(L.length+1))
    {
        printf("您输入的未知或程序出现错误!");
        return ERROR;
    }
    for(int j=L.length;j>=i;j--)
    {
        L.elem[j]=L.elem[j-1];
    }
    L.elem[i-1]=x;
    L.length++;
    printf("线性表中元素为:");
    for(int i=0;i<L.length;i++)
    {
        printf("%4d",L.elem[i]);
    }
    printf("\n");
    return OK;
}//将一个数x插在第i个元素前(x和i在程序运行时输入)
Status DestroyElem(SqList &L,int i)
{
    int y,j;
    if(i<1||i>L.length)
    {
        printf("您输入的未知或程序出现错误!");
        return ERROR;
    }
    y=L.elem[i-1];
    for(j=i;j<=L.length;j++)
    {
        L.elem[j-1]=L.elem[j];
    }
    L.length--;
    printf("线性表中元素为:");
    for(int i=0;i<L.length;i++)
    {
        printf("%4d",L.elem[i]);
    }
    printf("\n");
    printf("删除的元素为数字:%d\n",y);
    return OK;
}//删除并输出第i个元素
Status FindElem(SqList &L,int x)
{
    int i;
    for(i=0;i<L.length;i++)
    {
        if(L.elem[i]==x)
        {
            printf("元素在线性表中,且元素%d的位置为%d\n",x,(i+1));
            break;
        }
    }
    if(i==L.length) printf("元素%d不在线性表中\n",x);
    return OK;
}//查找给定值x是否在线性表中
Status PutList(SqList &L)
{
    for(int i=0;i<L.length;i++)
    {
        printf("第%2d个元素:%4d\n",(i+1),L.elem[i]);
    }
}//输出线性表中所有元素
int menu()
{
    printf("菜单:\n");
    printf("1.初始化一个线性表\n2.赋值初始线性表\n3.插入元素\n4.删除元素\n5.查找元素\n6.输出线性表\n7.结束程序\n");
    printf("请输入您要实施的项目:");
}
int main()
{
    int option,location,element;
    SqList List;
    InitList(List);
    menu();
    scanf("%d",&option);
    while(option!=7){
    switch(option)
	{
    case 1:
        printf("1.线性表初始化完成!\n");
        break;
	case 2:
		printf("2:赋值初始线性表\n");
		ValueList(List);
		break;
	case 3:
		printf("3:插入一个数字\n");
		printf("插入元素位置:");
		scanf("%d",&location);
		printf("插入元素数值:");
		scanf("%d",&element);
		InsertList(List,location,element);
		break;
	case 4:
		printf("4:删除一个数字\n");
		printf("删除元素位置:");
		scanf("%d",&location);
		DestroyElem(List,location);
		break;
	case 5:
		printf("5:查找元素\n");
		scanf("%d",&element);
		FindElem(List,element);
		break;
	case 6:
	    printf("6.输出元素:\n");
		PutList(List);
		break;
    default:
        printf("输入菜单名称错误\n");
        break;
	}
	menu();
    scanf("%d",&option);
	};
	printf("程序已结束,bye!");
	return 0;
}
举报

相关推荐

0 条评论