第六章 类、结构体、指针、引用

1 类和结构体

1.1 类的定义

在这里插入图片描述
类中的变量和函数被统一称为类的成员变量。
private后面的内容是私有成员变量,在类的外部不能访问;public后面的内容是公有成员变量,在类的外部可以访问。

1.2 类的使用

#include <iostream>

using namespace std;

const int N = 1000010;

class Person
{
    private:
        int age, height;
        double money;
        string books[100];
    
    public:
        string name;
        
        void say()
        {
            cout << "I'm " << name << endl;
        }
        
        int set_age(int a)
        {
            age = a;
        }
        
        int get_age()
        {
            return age;
        }
    
        void add_money(double x)
        {
            money += x;
        }
} person_a, person_b, persons[100];

int main()
{
    Person c;
    
    c.name = "yxc";      // 正确!访问公有变量
    c.age = 18;          // 错误!访问私有变量
    c.set_age(18);       // 正确!set_age()是共有成员变量
    c.add_money(100);
    
    c.say();
    cout << c.get_age() << endl;
    
    return 0;
}

1.3 结构体与类的联系与区别

结构体和类的作用是一样的。不同点在于类默认是private,结构体默认是public。
在这里插入图片描述

1.4 结构体的用途

结构体多用来封装一组数据

2 指针和引用

2.1 指针

指针指向存放变量的值的地址。因此我们可以通过指针来修改变量的值。
在这里插入图片描述
数组名是一种特殊的指针。指针可以做运算:

在这里插入图片描述

2.2 引用

引用和指针类似,相当于给变量起了个别名
在这里插入图片描述

3 链表(结构体、指针)

3.1 链表基本操作

在这里插入图片描述
头结点:第一个节点的地址

#include <iostream>
#include <cstdio>

using namespace std;

struct Node{
    int val;
    Node* next;
    
    Node(int n_val):val(n_val),next(NULL){}
};

int main()
{
    Node* p = new Node(1);
    Node* q = new Node(2);
    Node* o = new Node(3);
    
    Node* head = p; //头指针,第一个节点
    p->next = q;
    q->next = o;
    
    //插入节点
    Node* u = new Node(4);
    u->next = head;
    head = u;
    
    //删除1节点
    head->next = head->next->next;
    
    //链表的遍历
    for(Node* i = head; i != NULL; i = i->next){
        cout<<i->val<<endl;
    }
    
    return 0;
}

3.2 链表习题

1 合并两个排序的链表

输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。

样例
输入:1->3->5 , 2->4->5

输出:1->2->3->4->5->5
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* merge(ListNode* l1, ListNode* l2) {
        ListNode* l3 = new ListNode(-1);//建立一个头结点
        ListNode* tail = l3; //指向链表的尾结点,尾插法插入结点
        
        while(l1 && l2)
        {
            if(l1->val <= l2->val)
            {
                //插入l1的节点
                tail->next = l1;
                l1 = l1->next;
                tail = tail->next;//指向当前链表尾结点
            }else{
                //插入l2的节点
                tail->next = l2;
                l2 = l2->next;
                tail = tail->next;
            }
        }
        
        //当某个链表移动到结尾如l1 = l1->next == NULL,接上l2剩下的全部即可,反之
        if(l1 == NULL){
            tail->next = l2;
        }else{
            tail->next = l1;
        }
        
        return l3->next;
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值