数据结构实验报告:线性表的基本操作及应用

版权声明:转载请留言 https://blog.csdn.net/qq_40744093 https://blog.csdn.net/qq_40744093/article/details/86705133

                                 Dr.Kong设计了一件艺术品

一、实验目的

1、帮助读者复习C语言程序设计中的知识。

2、熟悉线性表的逻辑结构。

3、熟悉线性表的基本运算在两种存储结构上的实现,其中以熟悉链表的操作为侧重点。

二、实验题目描述(本次实验已选题目四)

本次实验提供4个题目,每个题目都标有难度系数,*越多难度越大,学生可以根据自己的情况选做!

题目一:单链表的基本操作(*)

题目二:约瑟夫环(**)

题目三:多项式的表示及相加(***)

题目四:Dr.Kong设计了一件艺术品(****)

三、实验前的准备工作(已掌握)

1、掌握线性表的逻辑结构。

2、掌握线性表的链式存储结构。

3、熟练掌握线性表的插入、删除等操作。

四、实验内容

1、题目四介绍与要求

[问题描述]

Dr.Kong设计了一件艺术品,该艺术品由N个构件堆叠而成,N个构件从高到低按层编号依次为1,2,……,N。艺术品展出后,引起了强烈的反映。Dr.Kong观察到,人们尤其对作品的高端部分评价甚多。

狂热的Dr.Kong一激动,对组成该艺术品的N个构件重新组合,比如:把第6层到第12层的构件搬下来,想一想,然后整体放到剩下构件的第7层下面;过一会儿,又把第2层到第9层的构件搬下来,整体放到剩下构件的第1层下面等等。于是,Dr.Kong在进行了连续若干次“搬来搬去”后,还是这N个构件,又诞生了一件新的艺术品。

[问题要求]

请输出新的艺术品最高十层构件的编号。

[输入]

第一行: N K         表示构件的总数和“搬来搬去”的总次数

第2~K+1行:A B C  表示要搬动的构件(即从第A层到第B层)整个放在第C层下面;

如果C等于0,则要搬动的构件将放到最高层。

[输出]

由十行组成,分别为组成新艺术品的第一层到第十层构件的编号。

[约束条件]

(1)   10≤N≤20000    1≤k≤1000

(2)   1≤A≤B≤N,      0≤C≤N-(B-A+1)

[标准输入]:

13 3
6 12 1
2 9 0
10 13 8

[标准输出]:

6
7
8
9
10
11
12
2
3
4

2、源代码及注释

#include<stdio.h>
#include<malloc.h>
typedef struct Linklist{                //声明一个结构体来存放链表节点
    int num;                            //表示各个艺术品的编号
    struct Linklist *next;              //指向下一个节点的指针
}node,*pnode;                           //node相当于struct Linklist,*pnode相当于node*;
void creat_tail(pnode &L,int n);        //使用尾插法创建能够表示艺术品链表的子函数
void moving(pnode &L,int A,int B,int C);//表示艺术品搬来搬去的子函数
void print_ten(pnode &L);               //打印新的艺术品最高十层构件的编号的子函数
int main()
{
    int N,K;                            //表示艺术品构件的总数和“搬来搬去”的总次数
    printf("请分别输入艺术品构件的总数和“搬来搬去”的总次数: ");
    int A,B,C;                          //表示要搬动的构件(即从第A层到第B层)整个放在第C
                                        //层下面,如果C等于0,则要搬动的构件将放到最高层
    scanf("%d%d",&N,&K);                //输入艺术品构件的总数和“搬来搬去”的总次数
    pnode L;                            //定义链表头结点
    creat_tail(L,N);                    //执行尾插法创建表示艺术品的链表的子函数
    for(int i=1;i<=K;++i)               //执行K次搬来搬去
    {
        printf("第%d次:请分别输入起始层数A,结束层数B,目的层数C: ",i);
        scanf("%d%d%d",&A,&B,&C);       //输入要搬A层到B层艺术品构件及要移动到目的地C层
        moving(L,A,B,C);                //执行搬来搬去的子函数
    }
    print_ten(L);                       //执行输出艺术品前十件的子函数
    return 0;                           //程序正常退出
}
void creat_tail(pnode &L,int n)
{
    L=(pnode)malloc(sizeof(node));      //头结点分配空间
    L->next=NULL;                       //初始化头结点指向空
    pnode p=L;                          //定义临时指针
    for(int i=1;i<=n;++i)
    {
        pnode s;                        //定义一个新的节点
        s=(pnode)malloc(sizeof(node));  //为新节点分配空间
        s->next=NULL;                   //初始化新节点
        s->num=i;                       //为新节点赋值编号
        p->next=s;                      //临时指针指向新节点
        p=s;                            //临时指针向后移动
    }
}
void moving(pnode &L,int A,int B,int C)
{
    pnode p=L,preA=L,pA=L,pB=L,pC=L;    //定义临时指针p,A位置前驱指针preA,A位置指针pA,
                                        //B位置指针pB,第C层位置指针pC,并全部初始化为L
    for(int i=1;i<A;++i)
    {
        p=p->next;
        preA=p;
    }                                   //临时指针p不断向后移动,得到A的位置前驱指针
    pA=preA->next;                      //得到A位置的指针
    p=L;                                //重置临时指针指向L位置
    while(B--)
    {
        p=p->next;
        pB=p;
    }                                   //临时指针p不断向后移动,得到B位置指针
    preA->next=pB->next;                //A位置的前驱指针指向B位置的后继
    pB->next=NULL;                      //B位置的指针指向为空
    p=L;                                //重置临时指针指向L位置
    while(C--)
    {
        p=p->next;
        pC=p;
    }                                   //临时指针p不断向后移动,得到C位置指针
    pB->next=pC->next;
    pC->next=pA;                        //使pA到pB插入到pC的后面
}
void print_ten(pnode &L)
{
    printf("打印结果如下:\n");
    pnode p=L->next;                    //定义临时指针并初始化为头结点的后继指针
    for(int i=1;i<=10;++i)
    {
        printf("第%2d层:%2d\n",i,p->num);//依次打印艺术品组件的编号
        p=p->next;                      //临时指针不断后移
    }
}

3、运行结果展示

      

 

 

猜你喜欢

转载自blog.csdn.net/qq_40744093/article/details/86705133