考研算法之结构体指针

结构体指针

链表完整相关知识参考博客: http://data.biancheng.net/view/160.html。

回顾一下结构体和指针的相关知识:

首先强调一下头指针和头节点的区别:

头指针是指向一个链表结构体的指针,不含值;头节点是一个链表结构体,一般不存值(或者说值没有意义)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
using namespace std;

struct Node{
int val;
Node* next;

Node(): val(0),next(NULL){}
Node(int _val): val(_val),next(NULL){}
};

void print(Node* head){
for (auto p = head; p; p = p->next){
cout << p->val << '\n';
}
}

int main(){
Node *head = new Node();

cout << head->val << '\n';
cout << (*head).val << '\n';

head->next = new Node(1);
head = head->next;

cout << head->val << '\n';
cout << (*head).val << '\n';

// 测试结果
/* 0
0
1
1 */
return 0;
}

关于Node* head = new Node()

申请一块内存空间,存放一个创建好的Node结构体,包含值和指向下一个结构体的指针共两部分。

然后会返回一个Node *,也就是指向这个创建好的结构体的指针。

head->val(*head).val

它们都可以访问到head指向结构体的值,同理可以访问到head指向结构体的next指针。

链表配图:

image-20211118224242449

一个完整的链表需要由以下几部分构成:

  1. 头指针:一个普通的指针,它的特点是永远指向链表第一个节点的位置。很明显,头指针用于指明链表的位置,便于后期找到链表并使用表中的数据;
  2. 节点:链表中的节点又细分为头节点、首元节点和其他节点:
    • 头节点:其实就是一个不存任何数据的空节点,通常作为链表的第一个节点。对于链表来说,头节点不是必须的,它的作用只是为了方便解决某些实际问题;
    • 首元节点:由于头节点(也就是空节点)的缘故,链表中称第一个存有数据的节点为首元节点。首元节点只是对链表中第一个存有数据节点的一个称谓,没有实际意义;
    • 其他节点:链表中其他的节点。

注意头节点和首节点的区别!!!

链表并没有非常严格的定义方式,可以在此基础上改动,比如取消头节点等等。

关于结构体指针的赋值的演示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
using namespace std;

struct Node{
int val;
Node* next;

Node(): val(0),next(NULL){}
Node(int _val): val(_val),next(NULL){}
};

void print(Node* head){
for (auto p = head; p; p = p->next){
cout << p->val << '\n';
}
}

int main(){
Node *front = new Node(),*rear = front; // 将结构体指针front赋值给rear
// front和rear将指向同一个结构体,这个结构体的val和next发生改变,两者都受影响

front->next = new Node(2);
front->val = 1;

cout << front->val << " - " << front->next << '\n';
cout << rear->val << " - " << rear->next << '\n';
// 测试结果
/* 1 - 0x6c2760
1 - 0x6c2760 */

return 0;
}
坚持原创技术分享,您的支持将鼓励我继续创作!