哈夫曼树_ 2023-10-26 09:44 采纳率: 57.7%
浏览 6
已结题

C++ while (true)哪里错了?

img


如图,代码提示我的第178行出错
完整代码如下:


#include<iostream>  
using namespace std;

struct node
{
    int data;   // 数据域  
    node* next;   // 指针域  
};

node* create()
{
    int x;   // 要插入的数据  
    node* head = NULL;
    node* current = NULL;

    cin >> x;
    while (x != 0)   // x = 0表示结束  
    {
        node* newNode = (node*)malloc(sizeof(node));   // 创建新节点  
        newNode->data = x;   // 存储数据  
        newNode->next = NULL;   // 初始化指针域为NULL  

        if (head == NULL)   // 如果链表为空,将新节点设为头节点  
        {
            head = newNode;
            current = newNode;
        }
        else   // 否则,将新节点添加到链表末尾  
        {
            current->next = newNode;   // 将当前节点的指针域设置为新节点  
            current = newNode;   // 将当前节点移到新节点上,以便下次添加新节点时可以正确地连接它们  
        }
        cin >> x;   // 获取下一个数据值  
    }
    return head;   // 返回头节点指针  
}

void printList(node * p)
{
    cout << "链表输出:";
    if (p == NULL)
    {
        cout << "链表为空!" << endl;
    }
    while (p != NULL)   // p->next可能为NULL,这将导致程序崩溃。  
    {
        cout << p->data << "\t";
        p = p->next;   // 将当前节点移到下一个节点上,以便继续打印下一个节点的数据。  
    }
    cout << endl;
}

void sort(node* p) {
    node* sorted = NULL;
    node* it = p;
    while (it != NULL) {
        node* min = it;
        node* ptr = it->next;
        while (ptr != NULL) {
            if (ptr->data < min->data) {
                min = ptr;
            }
            ptr = ptr->next;
        }
        if (min != it) {
            int temp = min->data;
            min->data = it->data;
            it->data = temp;
        }
        if (sorted == NULL || sorted->data > it->data) {
            sorted = it;
        }
        it = it->next;
    }
    p = sorted;
}

void insert(node*& head, int data) {
    node* newNode = (node*)malloc(sizeof(node));   // 创建新节点    
    newNode->data = data;   // 存储数据    
    newNode->next = NULL;   // 初始化指针域为NULL    

    if (head == NULL || head->data > newNode->data) {
        newNode->next = head;   // 如果新节点的值小于头节点的值,将新节点设为头节点    
        head = newNode;   // 更新头节点指针  
    }
    else {
        node* current = head;   // 初始化当前节点为头节点    
        while (current->next != NULL && current->next->data < newNode->data) {
            current = current->next;   // 遍历链表,找到正确的位置来插入新节点    
        }
        newNode->next = current->next;   // 将新节点插入到正确的位置    
        current->next = newNode;   // 更新当前节点的指针域  
    }
}

void del(node*& head, int data)
{
    if (head == NULL)
    {
        cout << "链表为空!" << endl;
    }
    else if (head->data == data)
    {
        node* temp = head;
        head = head->next;
        free(temp);
    }
    else
    {
        node* current = head;
        while (current->next != NULL && current->next->data != data)
        {
            current = current->next;
        }
        if (current->next != NULL)
        {
            node* temp = current->next;
            current->next = current->next->next;
            free(temp);
        }
    }
}

void reverse(node*& head)
{
    node* prev = NULL;
    node* current = head;
    node* next = NULL;

    while (current != NULL) {
        next = current->next;   // 暂时存储下一个节点  
        current->next = prev;   // 将当前节点的下一个节点指向前一个节点,实现逆序  
        prev = current;   // 将前一个节点移动到当前节点  
        current = next;   // 将当前节点移动到下一个节点  
    }

    head = prev;   // 头节点最后逆序后,将其设置为新的头节点  
}

void splitList(node* head, node** headOdd, node** headEven) {
    node* current = head;
    while (current != NULL) {
        if (current->data % 2 == 0) {
            *headEven = current;
            headEven = &((*headEven)->next);
        }
        else {
            *headOdd = current;
            headOdd = &((*headOdd)->next);
        }
        current = current->next;
    }
    (*headOdd)->next = NULL; // 最后一个奇数节点后面不需要连接其他节点,因此将其next指针设置为NULL  
    (*headEven)->next = NULL; // 最后一个偶数节点后面也不需要连接其他节点,因此将其next指针设置为NULL  
}

void deleteList(node* head) {
    node* current = head;
    node* nextNode = NULL;

    while (current != NULL) {
        nextNode = current->next;  // 记住下一个节点  
        delete current;  // 释放当前节点的内存  
        current = nextNode;  // 移动到下一个节点  
    }

    if (nextNode != NULL) {
        // 如果链表为空,头节点指针应该设置为NULL  
        delete head;
        head = NULL;
    }
}

int main()
{
    node* list = NULL;   // 这里使用的是node类型的指针变量。  
    while (true)
    {
        int choice;
        cout << "请选择要进行的操作: ";
        cout << "1、创建一条含正整数结点的无序链表" << endl;
        cout << "2、链表结点的输出" << endl;
        cout << "3、链表结点的升序排序" << endl;
        cout << "4、链表结点插入" << endl;
        cout << "5、链表结点删除" << endl;
        cout << "6、链表逆序(升序变降序)" << endl;
        cout << "7、链表拆分,将链表拆分成由奇数和偶数结点组成的两条链表" << endl;
        cout << "8、释放链表" << endl;
        cout << "0、退出" << endl;
        cin >> choice;
        switch (choice) {
        case 0:  // 退出程序  
            return 0;  // 结束程序  
        case 1:  // 创建链表功能      
            list = create();   // 为list赋值,以便使用它。
            break;
        case 2:  // 输出链表功能  
            printList(list);   // 打印链表数据。
            break;
        case 3:  // 升序排序
            sort(list);
            break;
        case 4:  // 插入节点
            int m;
            cout << "需要插入的数字:";
            cin >> m;
            insert(list, m);
            break;
        case 5:   // 删除节点
            int n;
            cout << "需要删除的数字:";
            cin >> n;
            del(list, n);
            break;
        case 6:
            reverse(list);
            break;
        case 7:
            node * listOdd, * listEven; // 用于存储拆分后的奇数链表和偶数链表的头节点指针  
            splitList(list, &listOdd, &listEven); // 拆分链表并存储奇数链表和偶数链表的头节点指针  
            break;
        case 8:
            deleteList(list);
            break;
        }
    }
}

  • 写回答

3条回答 默认 最新

  • 柯本 2023-10-26 10:17
    关注

    你的程序我用gcc , VS2022命令行及IDE下,编译都没有问题

    img


    可能的问题,我看你项目中还有一个link.cpp,是它影响了(VS的报错有时位置不对的)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月3日
  • 已采纳回答 10月26日
  • 创建了问题 10月26日

悬赏问题

  • ¥15 preLaunchTask"C/C++: aarch64- apple-darwin22-g++-14 生成活动 文件”已终止,退出代码为-1。
  • ¥18 关于#贝叶斯概率#的问题:这篇文章中利用em算法求出了对数似然值作为概率表参数,然后进行概率表计算,这个概率表是怎样计算的呀
  • ¥20 C#上传XML格式数据
  • ¥15 elementui上传结合oss接口断点续传,现在只差停止上传和继续上传,各大精英看下
  • ¥100 单片机hardfaulr
  • ¥20 手机截图相片分辨率降低一半
  • ¥50 求一段sql语句,遇到小难题了,可以50米解决
  • ¥15 速求,对多种商品的购买力优化问题(用遗传算法、枚举法、粒子群算法、模拟退火算法等方法求解)
  • ¥100 速求!商品购买力最优化问题(用遗传算法求解,给出python代码)
  • ¥15 虚拟机检测,可以是封装好的DLL,可付费