c_mylife 2022-03-11 15:08 采纳率: 100%
浏览 79
已结题

数据结构中的插入和删除算法 尽量使用C++语言书写

题目描述
某便利店员工想将超市中N个相似类型的产品摆在一排货架上,这些商品的被编号为1N,他采取如下方法:
·先把1号商品放入货架,这时货架中只有这一个商品;
·再将2
N号商品依次放入货架,编号为 i 的商品会被摆在编号为1i-1 中某个商品(即已摆好商品)的左边或右边;
·从货架中移去M(M<N)个商品,其他商品的摆放顺序不变。在所有商品按照上述方法全部摆好之后,员工需要统计从左到右所有商品的编号。
输入格式
·第1行:一个正整数N,表示有N个商品。
·第2
N行:每行包括两个整数 k,p,p为0或者1。 如果p=0表示将 i 号商品放在 k 号商品的左边,p=1 则表示摆在右边
·第N+1行:一个正整数M,表示移去的商品数目。
·接下来的M行:每行一个正整数 x,表示将 X号商品从货架中移去,如果 x 号商品已经不再货架中,则忽略这一指令。
输出格式
1行,包含最多N-1个空格隔开的正整数,表示了货架上从左到右商品的编号,行末换行且无空格。
数据规模
N,M≤100000

  • 写回答

2条回答 默认 最新

  • 关注

    运行结果如下(“----链表数据----”这一句在代码中已经注释掉了):

    img

    代码:

    #include <iostream>
    using namespace std;
    
    typedef struct _data 
    {
        int index;
        struct _data* next;
    }StNode;
    
    int main()
    {
        StNode* head,*ph,*th;
    
        //创建链表
        head = new StNode; //头结点
        ph = new StNode; //编号为1的节点
        ph->index = 1;
        ph->next = 0;
        head->next = ph;
    
        int n;
        cin >> n; //输入n的值
        for(int i=1;i<n;i++)
        {
            th = new StNode;
            th->index = i+1;
            th->next = 0;
            //输入k 和 p
            int k,p;
            cin>>k>>p;
            
            if(p==0)//放在k左边
            {
                ph = head;
                while(ph->next)
                {
                    if(ph->next->index == k)
                    {
                        th->next = ph->next;
                        ph->next = th;
                        break;
                    }
                    else
                        ph = ph->next;
                }
                
            }else
            {
                //放在k右边
                ph = head->next;
                while(ph)
                {
                    if(ph->index == k)
                    {
                        th->next = ph->next;
                        ph->next = th;
                        break;
                    }else
                        ph = ph->next;
                }
            }
        }
        //输入m
        int m;
        cin >> m;
        for (int i=0;i<m;i++)
        {
            int x;
            cin >> x; //输入需要删除的编号
            ph = head;
            while(ph->next)
            {
                if(ph->next->index == x)
                {
                    th = ph->next;
                    ph->next = th->next;
                    free(th);
                    break;
                }else
                    ph = ph->next;
            }
        }
    
        //显示链表
        //cout << "----链表数据:----"<<endl; //这一句注释掉就可以了
        ph = head->next;
        int flag = 0;
        while(ph)
        {
            if(flag == 0)
            {
                cout << ph->index ; //第一个只输出值
                flag = 1;
            }
            else
                cout <<" " << ph->index; //从第二个开始,先输出一个空格,然后再输出值
            ph = ph->next;
        }
    
        //释放空间
        while(head)
        {
            ph = head->next;
            free(head);
            head = ph;
        }
        head = 0;
        ph = 0;
        th = 0;
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月15日
  • 已采纳回答 4月7日
  • 创建了问题 3月11日

悬赏问题

  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口