定义结构体
typedef struct Node
{
string name; // 家电名称
string model; // 品牌型号
float price; // 单价
int quantity; // 数量
struct Node* next; // 下一个结点指针
} Node;
意思是,我们自己给这个链表定义了一些变量,这个链表的每一个结点包含着家电名称、品牌型号、单价、数量、下一个结点指针。
typedef struct Node
{
string name; // 家电名称
string model; // 品牌型号
float price; // 单价
int quantity; // 数量
struct Node* next; // 下一个结点指针
} Node;
相当于,等价于
typedef struct Node
{
string name; // 家电名称
string model; // 品牌型号
float price; // 单价
int quantity; // 数量
struct Node* next; // 下一个结点指针
};
typedef struct Node Node;
//意思是将Node 代替 struct Node
//当然这里也可以不一定要用Node,也可以写成typedef struct Node LNode,意思则相同是将LNode代替struct Node
初始化链表
// 初始化链表
void InitList(Node*& head) //看不懂
{
head = new Node;
head->next = NULL;
}
这里的&表示引用,给你举个例子大概就会明白
#include <iostream>
using namespace std;
void Value(int x) { // 这里没有&
x = 10;
}
int main() {
int value = 5;
cout << "Before: " << value << endl;
Value(value);
cout << "After: " << value << endl;
return 0;
}
//输出
Before:5
After:5
//————— ————— ———— —————— ——— ———— —————— ————— ———— —————
#include <iostream>
using namespace std;
void Value(int& x) { //这里有&
x = 10;
}
int main() {
int value = 5;
cout << "Before: " << value << endl;
Value(value);
cout << "After: " << value << endl;
return 0;
}
//输出
Before:5
After:10
通过两次对比会发现,结果不同,因为引用传递不会受到局部变量影响,引用本身就是对变量的地址的引用。
分析第一个代码,函数调用完为了节约空间,会被释放,所以这个x = 10函数调用(Value(value) 这里表示函数调用)完就被释放了
分析第二个代码,这个代码用了&,表示Value函数接受一个整数的引用int& x,并将这个引用传递的变量x修改为 10(x = 10;),(int value = 5;这个表示局部变量,通过引用传递,不会受这个局部变量影响),所以当它调用函数Value时,会将x=10的这个10传递给value,使value的值发生变化.
再分析Node*& head
为什么这么用,因为使用引用传递(&),会确保InitList函数里的head修改会影响到主函数(int main)里的head,为了成功初始化链表。
创建链表,按照单价的递增顺序插入结点
for (int i = 0; i < n; i++)
{
Node* newNode = new Node; //看不懂
cout << "请输入第 " << i + 1 << " 个家电的信息:" << endl;
cout << "家电名称:";
cin >> newNode->name;
cout << "品牌型号:";
cin >> newNode->model;
cout << "单价:";
cin >> newNode->price;
cout << "数量:";
cin >> newNode->quantity;
每for循环一次就创建一个指针newNode指向新的Node对象
这里的cin>>newNode->name是什么意思呢
就是输入家电的名称,为什么要newNode->name,因为前面我们也讲了,这个链表在前面被我们用结构体已经定义了,我们给他定义了有name、model等等。newNode->name表示这个newNode指向的链表的一个结点上的name,其余的都是这个意思。
在链表中找到插入位置
// 在链表中找到插入位置
Node* pre = head;
Node* cur = head->next;
while (cur != NULL && cur->price < newNode->price)
{
pre = cur; //看不懂
cur = cur->next; //看不懂
}
// 插入结点
pre->next = newNode; //看不懂
newNode->next = cur; //看不懂
}
这个和前面那段代码是一块的,我给分开了
while (cur != NULL && cur->price < newNode->price)
首先 && 左右的两个条件必须都满足,才能进行循环
咱先不看循环条件,咱先看循环内容,我们要清楚的是,每一次循环 pre 都要等于 cur 并且cur 都会指向cur的下一个结点,这里我画图给你表示
我们看循环的条件,cur != NULL 表示cur没有指向空(NULL),链表还可以继续遍历,cur->price < newNode->price表示当前节点的单价小于新节点的单价,意思是在找到合适的插入位置前,使得价格按照递增的顺序插入链表,然后循环退出时,表明找到了正确的插入位置。
查询家电信息
void SearchItem(Node* head, string item)
{
Node* p = head->next; //看不懂
bool found = false; //看不懂
while (p != NULL)
{
if (p->name == item)
{
cout << "家电名称:" << p->name << endl;
cout << "品牌型号:" << p->model << endl;
cout << "单价:" << p->price << endl;
cout << "数量:" << p->quantity << endl;
found = true;
break;
}
p = p->next;
}
if (!found)
{
cout << "未找到该家电信息!" << endl;
}
}
Node* p = head->next
然后 bool,只能取俩值 true 和 false。found是发现的意思,很合这个题意“查询”,所以取了found这个变量名,bool found 意思:found是布尔类型的变量。bool found = false :初始将found设为false,意思是尚未找到符合条件的对象,根据这个代码往下看你会发现,当p->name == item时,说明已经找到了,并且会将found设为true(找到符合条件对象),也就不会触发if(!found)这个if语句了
插入家电信息
void InsertItem(Node* head, string name, string model, float price, int quantity)
{
Node* p = head->next;
Node* pre = head; //看不懂
Node* newNode = new Node;
newNode->name = name;
newNode->model = model;
newNode->price = price;
newNode->quantity = quantity;