1215787625 发表于 2024-2-28 21:02:30

数据结构与算法课程中线性表的魔术师发牌问题求助

//打印出牌的顺序        1 8 2 5 10 3 Q J 9 4 7 6 K
问题1:见24行
问题2:见44行
问题3:怎么完善Delete函数
#include <iostream>
using namespace std;
struct cards {
        int data;
        cards* next;
};
const int total = 13;
cards* CreatLinkList(void);
void PrintLinkList(cards* card, int n);
//void DeleteLinkList(cards* card);
int main()
{
        cards* card = CreatLinkList();//创建一个链表
        card->data = 1;//第一张牌是1
        cards* head = card;
       
        for (int step = 2; step != 14; step++) {//开始寻找每一张牌
                for (int i = 1; i <= step; i++) {
                        card = card->next;
                        //cout << &card << endl;??为什么card的地址没有改变?
                        while (card->data != 0)
                                card = card->next;
                }
                card->data = step;//确认该位置的牌
        }

        card = head;
        PrintLinkList(card, total);

        //card = head;
        //DeleteLinkList(card);
       
        return 0;
}
cards* CreatLinkList(void)
{
        int i;
        cards* card = new cards;
        cards* head = card;
        for (i = 1; i < total; i++) {//这里明明只创建了12个内存空间,为什么最后结果显示的是13个?
                cards* p = new cards;
                p->data = 0;
                card->next = p;
                card = p;
                cout << i << endl;
        }
        card->next = head;
        card = head;
        return card;
}
void PrintLinkList(cards* card, int n)
{
        for (int i = 1; i <= n; i++) {
                cout << card->data << "";
                card = card->next;
        }
}
/*void DeleteLinkList(cards* card)
{
        while (1) {
                cards* p = card;
                if (p) {
                        p = p->next;
                        delete card;
                }
                else {
                        break;
                }
        }
}*/
问题见顶上角

FishC 发表于 2024-2-28 21:02:50

问题1:在第24行的代码中,应该使用箭头操作符(->)来访问card指针指向的下一个节点的data成员。应该修改为card = card->next。

问题2:在第44行的代码中,PrintLinkList函数的参数应该是head而不是card。因为你要打印的是整个链表,而链表的起始节点是head。

问题3:要完善Delete函数,可以按照以下步骤进行:
- 定义一个指针变量temp,用于遍历链表。
- 使用一个循环来依次释放链表的每个节点,直到链表为空。
- 在每次释放节点之前,先将当前节点的下一个节点保存到temp指针中,然后再删除当前节点。
- 最后,将head指针设置为nullptr,表示链表已经被完全删除。

以下是完善后的代码示例:
void DeleteLinkList(cards* head) {
    cards* temp = nullptr;
    while (head != nullptr) {
      temp = head->next;// 保存当前节点的下一个节点
      delete head;// 删除当前节点
      head = temp;// 移动到下一个节点
    }
}

你可以在程序的主函数中将DeleteLinkList函数的调用取消注释,并且将PrintLinkList函数的调用注释掉,然后运行代码,就能够看到链表被成功删除的效果了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 数据结构与算法课程中线性表的魔术师发牌问题求助