数据结构与算法课程中线性表的魔术师发牌问题求助
//打印出牌的顺序 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;
}
}
}*/
问题见顶上角 问题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]