数据结构作业_顺序表

【项目1 – 顺序表的基本运算】

建立建立顺序表运算的算法库。
算法库包括两个文件:
头文件:list.h,包含定义顺序表数据结构的代码、宏定义、要实现算法的函数的声明;
源文件:list.cpp,包含实现各种算法的函数的定义
请采用程序的多文件组织形式,建立如上的两个文件,另外再建立一个源文件,编写main函数,完成相关的测试工作(以下操作在主函数中调用实现)。

  1. 创建一个顺序表,测试样例:5,9,6,7,4,8,1,3,2;
  2. 在已经建立的线性表的第8个位置插入一个元素x(10),测试样例:5,9,6,7,4,8,1,10,3,2。
  3. 删除第4个位置上的元素,并输出线性表。
  4. 从顺序表中删除具有最小值的元素(假设值唯一),并由函数返回被删除元素的值。若顺序表为空则提示错误信息信息并退出。注意时间复杂度。
  5. 编写算法函数 Reverse( )实现将顺序表的倒置。要求算法的空间复杂度为O(1)

list.h

#ifndef LIST_H_INCLUDED
#define LIST_H_INCLUDED

#include<stdio.h>
#define MaxSzie 100

typedef int ElemType;

typedef struct
{
    ElemType data[MaxSzie];
    int length;
}SqList;

void CreateList(SqList *&L, ElemType a[],int n);

void InitList(SqList *&L);

void Insert(SqList *&L, int i,int n);

void ShowList(SqList *L);

void DeleteList(SqList *&L,int n);

void Reverse(SqList *&L);

void DeleteMin(SqList *&L);

#endif // LIST_H_INCLUDED

list.cpp

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include "list.h"


void CreateList(SqList *&L, ElemType a[],int n)
{
    int i =0,k =0 ;
    L = (SqList *)malloc(sizeof(SqList));
    while(i<n)
    {
        L->data[k] = a[i];
        k++;
        i++;
    }
    L->length = k;
}

void InitList(SqList *&L)
{
    printf("正在进行列表初始化:\n");
    L=(SqList *)malloc(sizeof(SqList));
    L->length = 0;
    printf("列表初始化完成!\n\n");
}

void Insert(SqList *&L, int i,int n)
{
    int j;
    if(i<1||i>L->length+1||L->length==MaxSzie)
    {
        printf("无法插入!\n");
    }
    else
    {
        for(j = L->length;j>i;j--)
        {
            L->data[j] = L->data[j-1];
        }
        L->data[i] = n;
        L->length++;
    }
}
void ShowList(SqList *L)
{
    int i;
    for(i=0;i<L->length;i++)
    {
        printf("%d ",L->data[i]);
    }
    printf("\n");
}

void DeleteList(SqList *&L,int n)
{
    if(n<1||n>L->length)
    {
        printf("删除位置不存在\n");
    }
    n--;
    int i;
    for(i=n;i<L->length;i++)
    {
        L->data[i] = L->data[i+1];
    }
    L->length--;
}
void Reverse(SqList *&L)
{
    int temp,i;
    for(i = 0;i<L->length/2;i++)
    {
        temp = L->data[i];
        L->data[i] = L->data[L->length-1-i];
        L->data[L->length-1-i] = temp;
    }
}

void DeleteMin(SqList *&L)
{
    int i;
    int Min = L->data[0];
    int MinPos = 0;
    if(L->length == 0)
    {
        printf("列表为空,信息错误\n");
    }
    for(i=0;i<L->length;i++)
    {
        if(L->data[i]<Min)
        {
            Min = L->data[i];
            MinPos = i;
        }
    }
    DeleteList(L,MinPos);
    printf("被删除的数是:%d\n",Min);
    ShowList(L);

}

main.cpp

#include <iostream>
#include<stdio.h>
#include "list.h"
#include "list.cpp"
using namespace std;

int main()
{
    int n,i,k;
    SqList *L;
    printf("请输入创建数组的大小:\n");
    scanf("%d",&n);
    int a[n];
    printf("请输入创建数组的每个数:\n");
    for(i =0;i<n;i++)
    {
        scanf("%d",&k);
        a[i]=k;
    }
    //初始化列表
    InitList(L);
    printf("1.+++++++++++++++++++++++++++++\n");
    //1.创建一个顺序表,测试样例:5,9,6,7,4,8,1,3,2
    CreateList(L,a,n);
    ShowList(L);
    printf("2.+++++++++++++++++++++++++++++\n");
    //2.在已经建立的线性表的第8个位置插入一个元素x(10),测试样例:5,9,6,7,4,8,1,10,3,2。
    Insert(L,8,10);
    ShowList(L);
        printf("3.+++++++++++++++++++++++++++++\n");
    //3.删除第4个位置上的元素,并输出线性表
    DeleteList(L,4);
    ShowList(L);
        printf("4.+++++++++++++++++++++++++++++\n");
    //从顺序表中删除具有最小值的元素(假设值唯一),并由函数返回被删除元素的值。若顺序表为空则提示错误信息信息并退出。注意时间复杂度。
    DeleteMin(L);
    printf("5.+++++++++++++++++++++++++++++\n");
    //5.编写算法函数 Reverse( )实现将顺序表的倒置。要求算法的空间复杂度为O(1)
    Reverse(L);
    ShowList(L);
}

运行结果如下:

在这里插入图片描述

【项目2 – 顺序表应用】

在上题完成的算法库的基础上,定义一个采用顺序结构存储的线性表,设计算法完成下面的工作:
1、删除元素下标介于[x, y]之间的所有元素(包含x,y要求x < y ),x,y由用户随机指定,如果x, y 不合理或者顺序表为空则显示出错信息并退出运行。 尽量考虑以较好的时间复杂度和空间复杂度来实现。
2、将所有偶数移到所有奇数的前面,尽量考虑以较好的时间复杂度和空间复杂度来实现。

【提示】:
(1)充分利用前面建立的算法库解决建立顺序表、输出线性表的问题;
(2)为保证复杂度的要求,设计算法并用专门的函数实现算法;
(3)每项工作写一个程序

基于项目一的代码,在其上进行补充:

list.h

bool DeleteSome(SqList *&L,int x,int y);

void change(SqList *&L);

list.cpp

//项目二
bool DeleteSome(SqList *&L,int x,int y)
{
    int m = y-x+1;//计算还有多少元素
    int j;
    if(y<=x||x<0||y>L->length)
    {
        return false;
    }

    for(j =x-1;j<L->length-m;j++)
    {
        L->data[j] = L->data[j+m];
    }
    L->length = L->length-m;
    return true;

}

void change(SqList *&L)
{
    int i,j;
    int temp;
    for(i = 0;i<L->length;i++)
    {
        if(L->data[i]%2 == 0)
        {
            for(j = i+1;j<L->length;j++)
            {
                if(L->data[i]%2 == 1)
                {
                    temp = L->data[i];
                    L->data[i] = L->data[j];
                    L->data[j] = temp;
                }
            }
        }
    }
    ShowList(L);

}

mian.cpp

    printf("项目二+++++++++++++++++++++++++++++\n");

    printf("1.+++++++++++++++++++++++++++++\n");
    if(DeleteSome(L,3,5))
    {
        printf("删除成功 !\n");
    }
    else
    {
        printf("发生错误!\n");
    }
    printf("2.+++++++++++++++++++++++++++++\n");
    change(L);

运行结果如下:
在这里插入图片描述
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值