顺序与链式解决办法

问题:现给出一组数据(如:0 1 2 3 4 5 6 7 8 9),令这组数据左移n位,并将左移的数填补在数据右侧。(如:左移三位,结果为3 4 5 6 7 8 9 0 1 2)。请写出对应的顺序喝链式解决方法。

顺序存储

顺序存储是指在内存中开辟连续的存储空间来存放数据,比较有代表性的就是数组以及ArrayList集合这种结构的存储方式都是使用的顺序存储来存储元素对象的;而ArrayList的底层也是通过数组来存储数据元素的,所以我们可以通过数组来观察顺序存储的优缺点。

优点:查询、遍历效率高

缺点:增删改效率低

链式存储

链式存储的存储空间不是连续的,它是通过指针来指向下一个元素或者上一个元素的地址来定位到该元素的,链式存储的由数据域(data域)与指针域(也叫做地址域,单向链表只有尾指针,双向链表有头指针和尾指针)两部分构成,通过指针指向下一元素,将所有的元素穿插起来,从而形成了一个链表。

优点:增删改效率高

缺点:查询、遍历效率低

顺序排序解法:

#include<stdio.h>

#define n 10

int main()

{

    int a[n];

    for(int i=0;i<n;i++)

    {

        a[i]=i;

        printf("%d ",a[i]);

    }

    int m;

    printf("\n左移位数:");

    scanf("%d",&m);

    int b[n];

    for(int i=m,I=0;(i<n);i++,I++)

    {

        b[I]=a[i];

    }

    for(int i=0,I=n-m;i<m;i++,I++)

    {

        b[I]=a[i];

    }

    for(int i=0;i<n;i++)

    {

        a[i]=b[i];

        printf("%d ",a[i]);

    }

    return 0;

}

 链式排序解法:

#include "stdio.h"

#include "stdlib.h"                //提供malloc()和free()

#include "string.h"                //提供strcpy()等

struct Node

{

    int a;                //数据域

    struct Node* next;    //指针域(指向节点的指针)

};

struct Node* head= NULL;

struct Node* end = NULL;

void AddListTill(int a )

{

        //创建一个节点

        struct Node* temp=(struct Node*)malloc(sizeof(struct Node));        //此处注意强制类型转换

        //节点数据进行赋值

        temp->a=a;

        temp->next=NULL;

        

        //连接分两种情况1.一个节点都没有2.已经有节点了,添加到尾巴上

        if(NULL==head)

        {

            head=temp;

        //    end=temp;

        }

        else

        {

        end->next=temp;

    //    end=temp;            //尾结点应该始终指向最后一个

        }

        end=temp;            //尾结点应该始终指向最后一个

}

int main()

{

    int k;

    printf("数据:");

    while(scanf("%d",&k)!=0)

    {

        AddListTill(k);

    }

    getchar();

    int m;

    printf("左移位数:");

    

    scanf("%d",&m);

    

    struct Node *H=head;

    int i=1;

    while((NULL!=H))

    {

        if(i<=m)

        {}

        else

        {

            printf("%d ",H->a);

        }

        H = H->next;

        i++;

    }

    struct Node *M=head;

    i=1;

    while((NULL!=M))

    {

        if(i<=m)

        {

            printf("%d ",M->a);

        }

        else

        {

            break;

        }

        M = M->next;

        i++;

    }

    return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mark_Evan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值