C++结构体简单链表原理解释

对结构体简单链表原理的简单解释,程序如下:

struct lianbiao
{
    int no;
    string name;
    struct lianbiao* next;
};

lianbiao* head = nullptr, * tail = nullptr, * tmp = nullptr;
    tmp = new lianbiao({ 1,"1",nullptr });
    cout << tmp->no << endl <<"tmp地址"<< & tmp << endl <<"tmpnext值" << tmp->next << endl << endl;
    head = tail = tmp;
    cout << head->no << endl<<"head地址" << &head <<head<< endl <<"head next值" << head->next << endl;
    cout << tail->no << endl <<"tail地址"<< & tail <<tail<< endl <<"tail next值" <<tail->next << endl << endl;

    tmp = new lianbiao({ 2,"2",nullptr });
    cout << "。" << endl;
    cout << tmp->no << endl <<"tmp地址" << &tmp<<"hh"<<tmp << endl << "tmpnext值" << tmp->next << endl;
    head->next = tmp;
    cout << tail->no << endl <<"tail地址"<< &tail <<"hh" << tail << endl << "tail next值" << &(tail->next) << endl;
    cout << head->no << endl << "head地址" << &head <<"hh" <<head<< endl << "head next值" << &(head->next) << endl;
    tail = tmp;
    cout << tail->no << endl << "tail地址" << &tail << endl << "tail next值" << &(tail->next) << endl;
    tmp = new lianbiao({ 3,"3",nullptr });
    cout << ".." << endl;
    cout << tmp->no << endl << "tmp地址" << &tmp << endl << "tmpnext值" << tmp->next << endl;
    tail->next = tmp;
    cout << tail->no << endl << "tail地址" << &tail << endl << "tail next值" << tail->next << endl;
   cout << head->no << endl << "head地址" << &head << endl << "head next值" << head->next << endl;
    tail = tmp;
    cout << tail->no << endl << "tail地址" << &tail << endl << "tail next值" << tail->next << endl;
    cout << head->no << endl << "head地址" << &head << endl << "head next值" << head->next << endl;
    tmp = head;
    cout << "." << endl;
    cout << tmp->no << endl << &tmp << endl << tmp->next << endl;
    while (tmp != nullptr)
    {
        cout << "0000" << endl;
        cout << tmp->no << endl<<&tmp<<endl<<tmp->next << endl;
        cout << tail->no << endl << "tail地址" << &tail << endl << "tail next值" << tail->next << endl;
        cout << head->no << endl << "head地址" << &head << endl << "head next值" << head->next << endl;
        tmp = tmp->next;
    }
    while (head != nullptr) {
        tmp = head;
        head = head->next;
        delete tmp;
    }

 运行结果如下:

1
tmp地址000000C8F6BCF168
tmpnext值0000000000000000

1
head地址000000C8F6BCF1280000027FE3431F50
head next值0000000000000000
1
tail地址000000C8F6BCF1480000027FE3431F50
tail next值0000000000000000


2
tmp地址000000C8F6BCF168hh0000027FE3420F50
tmpnext值0000000000000000
1
tail地址000000C8F6BCF148hh0000027FE3431F50
tail next值0000027FE3431F80
1
head地址000000C8F6BCF128hh0000027FE3431F50
head next值0000027FE3431F80
2
tail地址000000C8F6BCF148
tail next值0000027FE3420F80
..
3
tmp地址000000C8F6BCF168
tmpnext值0000000000000000
2
tail地址000000C8F6BCF148
tail next值0000027FE341F350
1
head地址000000C8F6BCF128
head next值0000027FE3420F50
3
tail地址000000C8F6BCF148
tail next值0000000000000000
1
head地址000000C8F6BCF128
head next值0000027FE3420F50
.
1
000000C8F6BCF168
0000027FE3420F50
0000
1
000000C8F6BCF168
0000027FE3420F50
3
tail地址000000C8F6BCF148
tail next值0000000000000000
1
head地址000000C8F6BCF128
head next值0000027FE3420F50
0000
2
000000C8F6BCF168
0000027FE341F350
3
tail地址000000C8F6BCF148
tail next值0000000000000000
1
head地址000000C8F6BCF128
head next值0000027FE3420F50
0000
3
000000C8F6BCF168
0000000000000000
3
tail地址000000C8F6BCF148
tail next值0000000000000000
1
head地址000000C8F6BCF128
head next值0000027FE3420F50

主要关键步骤在于

 head->next = tmp;

此部分代码运行结果如下:


2
tmp地址000000C8F6BCF168hh0000027FE3420F50
tmpnext值0000000000000000
1
tail地址000000C8F6BCF148hh0000027FE3431F50
tail next值0000027FE3431F80
1
head地址000000C8F6BCF128hh0000027FE3431F50
head next值0000027FE3431F80
2
tail地址000000C8F6BCF148
tail next值0000027FE3420F80

可以看出,在head = tail = tmp;操作中,将三者的结构体指针指向了同一地址,因此通过将临时结构体的地址传给tail 或head的结构体指针,即可实现第一个位置传递,之后再将第二个临时结构体赋给tail结构体,实现tail结构体结构体指针next的更改与清零,此时tail next 与headnext已不再是同一地址,因此不会改变head next值;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值