结构体指针
链表完整相关知识参考博客: 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';
return 0; }
|
关于Node* head = new Node()
:
申请一块内存空间,存放一个创建好的Node
结构体,包含值和指向下一个结构体的指针共两部分。
然后会返回一个Node *
,也就是指向这个创建好的结构体的指针。
head->val
和(*head).val
:
它们都可以访问到head指向结构体的值,同理可以访问到head指向结构体的next指针。
链表配图:

一个完整的链表需要由以下几部分构成:
- 头指针:一个普通的指针,它的特点是永远指向链表第一个节点的位置。很明显,头指针用于指明链表的位置,便于后期找到链表并使用表中的数据;
- 节点:链表中的节点又细分为头节点、首元节点和其他节点:
- 头节点:其实就是一个不存任何数据的空节点,通常作为链表的第一个节点。对于链表来说,头节点不是必须的,它的作用只是为了方便解决某些实际问题;
- 首元节点:由于头节点(也就是空节点)的缘故,链表中称第一个存有数据的节点为首元节点。首元节点只是对链表中第一个存有数据节点的一个称谓,没有实际意义;
- 其他节点:链表中其他的节点。
注意头节点和首节点的区别!!!
链表并没有非常严格的定义方式,可以在此基础上改动,比如取消头节点等等。
关于结构体指针的赋值的演示:
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->next = new Node(2); front->val = 1;
cout << front->val << " - " << front->next << '\n'; cout << rear->val << " - " << rear->next << '\n';
return 0; }
|