家电系统Household

定义结构体

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;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值