m0_74020564 2022-12-04 22:01 采纳率: 100%
浏览 49
已结题

大佬帮看看c语言链表的一个问题,这里的输入该怎么处理啊

【1】 (程序设计)链表插入与删除。读入多行命令,每行只有一个命令,根据命令操作链表,输出最后的链表。
append,100 表示在链表的最后增加一个数据为100的节点
insert,10,1234 表示在链表的第10个位置(最前面的位置为0)插入数据为1234的节点
delete,5,1000 表示删除第5个节点,后面可能还有一个多余的数据,程序要跳过此数据
end 表示命令输入结束

输入例子:
append,100
append,101
append,102
append,103
insert,2,1000
delete,1,1000
insert,2,1001
append,1002
end

输出结果:
100 1000 1001 102 103 1002

  • 写回答

1条回答 默认 最新

  • 牛马不分 2022-12-05 18:03
    关注

    望采纳

    #include <iostream>
    #include <string>
    using namespace std;
    
    //定义单链表节点
    using LNode = struct LNode
    {
        int data;
        LNode* next;
    };
    using ElemType = int;
    using LinkList = LNode*;
    
    //初始化单链表
    //带头结点的单链表
    bool InitListHead(LinkList& L)
    {
        L = new LNode;
        if (L == nullptr)
        {
            return false;
        }
        L->next = nullptr;
        return true;
    }
    
    //按位序插入  在表L中的第i几个位置插入指定元素e
    bool ListInsert(LinkList& L, int i, ElemType e)
    {
        if (i < 1)
        {
            return false;
        }
        LNode* p = L;
        int j = 0;
        while (p != nullptr && j < i - 1)  //循环找到i-1节点
        {
            p = p->next;
            j++;
        }
        if (p == nullptr)
        {
            return false;
        }
        LNode* s = new LNode;
        s->data = e;
        s->next = p->next;
        p->next = s;
        return true;
    }
    
    //删除(带头结点)
    bool ListDelete(LinkList& L, int i, ElemType& e)
    {
        if (i < 1)
        {
            return false;
        }
        LNode* p = L;
        int j = 0;
        while (p != nullptr && j < i - 1)
        {
            p = p->next;
            j++;
        }
        if (p == nullptr || p->next == nullptr)
        {
            return false;
        }
        LNode* q = p->next;
        p->next = q->next;
        e = q->data;
        delete q;
        return true;
    }
    
    
    //尾插法
    LinkList List_TailInert(LinkList& L, int e)
    {
        if (L == nullptr)
        {
            L = new LNode;           //建立头结点
            L->next = nullptr;
            L->data = e;
        }
        else
        {
            LNode* r = L;           //r为表尾指针
            while (r->next != nullptr)
                r = r->next;
            LNode* s = new LNode;   // 插入节点
            if (s == nullptr)
            {
                return s;
            }
            s->data = e;
            s->next = r->next;
            r->next = s;
        }
        return L;
    }
    
    /**
     * @brief 打印
     */
    void print_list(LinkList& L)
    {
        LinkList temp = L;
        while (temp != nullptr)
        {
            std::cout << temp->data << " ";
            temp = temp->next;
        }
        std::cout << std::endl;
    }
    
    
    //清空链表
    void clearList(LinkList& L)
    {
        LinkList p = L;
        while (L)
        {
            L = L->next;//先移动L
            delete p;//再释放p
            p = L;//再移动p
        }
        cout << "链表清空完毕!\n";
    
    }
    
    
    int main()
    {
        std::string ch;                // 输入命令
        int y = 0;                     // 输入结束符
    
        LinkList L = nullptr;          // 链表
        do
        {
            std::cout << "************************************" << std::endl;
            std::cout << "\n\t 输入指令 ";
            std::cout << "\n 1. append,100 表示在链表的最后增加一个数据为100的节点";
            std::cout << "\n 2. insert,10,1234 表示在链表的第10个位置(最前面的位置为0)插入数据为1234的节点";
            std::cout << "\n 3. delete,5,1000 表示删除第5个节点,后面可能还有一个多余的数据,程序要跳过此数据";
            std::cout << "\n 4. end 表示命令输入结束 \n";
            std::cout << "************************************" << std::endl;
            std::cout << "\n输入您的选择: ";
            std::getline(std::cin, ch);
    
            int nRet = -1;
            nRet = ch.find("append");
            if (nRet != -1)
            {
                std::string temp = ch.substr(nRet + 7, ch.size() - 1);
                int nData = std::atoi(temp.c_str());  // 截取插入数据
                L = List_TailInert(L, nData);
                continue;
            }
    
            nRet = ch.find("insert");
            if (nRet != -1)
            {
                // insert,10,1234
                int nSerach = ch.find(",", nRet);                               // 确定第1个 "," 位置
                int nSerach001 = ch.find(",", nSerach + 1);                     // 确定第2个 "," 位置
                std::string temp = ch.substr(nSerach + 1, nSerach001 - nSerach - 1);    // 位置          
                std::string temp1 = ch.substr(nSerach001 + 1, ch.size() - 1);            // 截取插入数据
    
                int nNum = std::atoi(temp.c_str());       // 截取插入数据
                int nData = std::atoi(temp1.c_str());     // 位置
                bool isInsertFlag = ListInsert(L, nNum, nData);
                if (!isInsertFlag)
                {
                    std::cout << "insert error" << std::endl;
                }
                else
                {
                    std::cout << "insert success! ch =[" << ch << "]" << std::endl;
                }
                continue;
            }
    
            nRet = ch.find("delete");
            if (nRet != -1)
            {            
                // delete,5,1000
                int nSerach = ch.find(",", nRet);                               // 确定第1个 "," 位置
                int nSerach001 = ch.find(",", nSerach + 1);                     // 确定第2个 "," 位置
                std::string temp = ch.substr(nSerach + 1, nSerach001 - nSerach - 1);    // 位置          
                std::string temp1 = ch.substr(nSerach001 + 1, ch.size() - 1);            // 截取插入数据
    
                int nNum = std::atoi(temp.c_str());       // 截取插入数据
                int nData = std::atoi(temp1.c_str());     // 位置
                bool isInsertFlag = ListDelete(L, nNum, nData);
                if (!isInsertFlag)
                {
                    std::cout << "delete error" << std::endl;
                }
                else
                {
                    std::cout << "delete success! ch =[" << ch << "]" << std::endl;
                }
    
                continue;
            }
    
            nRet = ch.find("end");
            if (nRet != -1)
            {
                print_list(L);
                clearList(L);
                y = 0;    
                break;
            }
    
            std::cout << "\n输入有效选项.\n";
    
        } while (y != 1);
        return 0;
    }
    

    打印

    ************************************
    
             输入指令
     1. append,100 表示在链表的最后增加一个数据为100的节点
     2. insert,10,1234 表示在链表的第10个位置(最前面的位置为0)插入数据为1234的节点
     3. delete,5,1000 表示删除第5个节点,后面可能还有一个多余的数据,程序要跳过此数据
     4. end 表示命令输入结束
    ************************************
    
    输入您的选择: append,100
    ************************************
    
             输入指令
     1. append,100 表示在链表的最后增加一个数据为100的节点
     2. insert,10,1234 表示在链表的第10个位置(最前面的位置为0)插入数据为1234的节点
     3. delete,5,1000 表示删除第5个节点,后面可能还有一个多余的数据,程序要跳过此数据
     4. end 表示命令输入结束
    ************************************
    
    输入您的选择: append,200
    ************************************
    
             输入指令
     1. append,100 表示在链表的最后增加一个数据为100的节点
     2. insert,10,1234 表示在链表的第10个位置(最前面的位置为0)插入数据为1234的节点
     3. delete,5,1000 表示删除第5个节点,后面可能还有一个多余的数据,程序要跳过此数据
     4. end 表示命令输入结束
    ************************************
    
    输入您的选择: append,300
    ************************************
    
             输入指令
     1. append,100 表示在链表的最后增加一个数据为100的节点
     2. insert,10,1234 表示在链表的第10个位置(最前面的位置为0)插入数据为1234的节点
     3. delete,5,1000 表示删除第5个节点,后面可能还有一个多余的数据,程序要跳过此数据
     4. end 表示命令输入结束
    ************************************
    
    输入您的选择: insert,1,400
    insert success! ch =[insert,1,400]
    ************************************
    
             输入指令
     1. append,100 表示在链表的最后增加一个数据为100的节点
     2. insert,10,1234 表示在链表的第10个位置(最前面的位置为0)插入数据为1234的节点
     3. delete,5,1000 表示删除第5个节点,后面可能还有一个多余的数据,程序要跳过此数据
     4. end 表示命令输入结束
    ************************************
    
    输入您的选择: delete,1,400
    delete success! ch =[delete,1,400]
    ************************************
    
             输入指令
     1. append,100 表示在链表的最后增加一个数据为100的节点
     2. insert,10,1234 表示在链表的第10个位置(最前面的位置为0)插入数据为1234的节点
     3. delete,5,1000 表示删除第5个节点,后面可能还有一个多余的数据,程序要跳过此数据
     4. end 表示命令输入结束
    ************************************
    
    输入您的选择: end
    100 200 300
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 12月16日
  • 已采纳回答 12月8日
  • 修改了问题 12月5日
  • 创建了问题 12月4日

悬赏问题

  • ¥15 前端 uniapp App端在离线状态如何使用modbus 连接手机蓝牙进行读写操控机器?
  • ¥15 SQL语句根据字段自动生成行
  • ¥500 “掌声响起来”软件(不确定性人工智能)
  • ¥500 我要找大模型一体机产品手册和应用案例
  • ¥60 用r语言进行数据分析
  • ¥20 关于游戏c++语言代码问题
  • ¥15 如何制作永久二维码,最好是微信也可以扫开的。(相关搜索:管理系统)
  • ¥15 delphi indy cookie 有效期
  • ¥15 labelme打不开怎么办
  • ¥35 按照图片上的两个任务要求,用keil5写出运行代码,并在proteus上仿真成功,🙏