试写一算法,实现顺序表的就地逆置,即利用原表的存储空间将线性表(a1, a2,..., an)逆置为(an, an-1, ..., a1)

NOTICE: 本篇代码是按照源码的书写顺序所写,复制之后可直接运行。

环境: vscode

题目:

试写一算法,实现顺序表的就地逆置,即利用原表的存储空间将线性表(a1, a2,..., an)逆置为(an, an-1, ..., a1)

分析:

该题有两个点必须注意:1.是顺序表不是单链表;2.利用原表的存储空间实现逆置

利用原表的存储空间就意味着不能再创建一个表,将原表的数据元素插入新的表中。

代码:

创建顺序表:

#include
#include
#include

#define OK 1
#define ERROR 0
#define LISTINCREMENT 2
#define initsize 10

typedef int ElemType;
typedef int Status;

typedef struct   
{
    ElemType *elem;     
    int length;
    int listsize;   
}SqList;

Status CreateList(SqList &L, int n)
{
    ElemType *p;
    L.elem = (ElemType *)malloc(initsize * sizeof(ElemType));
    if(!L.elem)
        printf("\n分配失败\n");
    printf("请依次输入顺序表的数据元素:\n");
    for(p=L.elem; p< L.elem+n; p++)
        scanf("%d ", p);
    L.length = n;
    L.listsize = initsize;
    if(L.length)
        printf("顺序表创建成功,它的长度为:%d\n", L.length);

    return OK;
}//CreateList

打印顺序表:

Status DispList(SqList &L)
{
    for(int i=0; i

逆置:

Status ListOppose(SqList &L)
{   // 颠倒顺序表中的数据元素
    int i;
    ElemType x;
    for(i=0; i< L.length/2; i++)       // 只需要遍历原表的一半就可以实现数据元素位置的交换
    {
        x = L.elem[i];
        // printf("L 的第%d个数据元素为:%d\n", i, L.elem[i]);
        L.elem[i] = L.elem[L.length-i-1];        // 数据元素交换->逆置
        L.elem[L.length-i-1] = x;                
    }
    return OK;
}//ListOppose

这里需要注意一下,我创建的表如下图所示:

我们要做的工作就是将 1 和 5 交换位置, 将 2 和 4 交换位置,那么我们只需要利用一个迭代变量 i 遍历表长(5)的一半就可以了。

主函数:

int main()
{
    int i;
    SqList L;
    CreateList(L, 5);
    printf("\n创建的顺序表为:\n");
    DispList(L);

    ListOppose(L);
    printf("\n颠倒后的顺序表为:\n");
    DispList(L);

    return OK;
}

运行结果示意图:

试写一算法,实现顺序表的就地逆置,即利用原表的存储空间将线性表(a1, a2,..., an)逆置为(an, an-1, ..., a1)_第1张图片

END!

你可能感兴趣的:(数据结构)