常数 NULL
是一个指标,用来表示空、没有资料的概念
struct
可以自定义包含多个值的资料结构
#include <stdio.h>
#include <stdlib.h>
typedef struct Data{
int a;
int b;
}data;
int main() {
data d={10, 20};
printf("%d %d", d.a, d.b);
}
透过指标可以取得另一个变数
#include <stdio.h>
#include <stdlib.h>
int main() {
int x=10, *p=&x;
printf("%d", *p);
}
结合两者能够达成可互相连结的资料结构
和宣告指标变数时一样,宣告资料结构的指标变数,要在变数名称前加上 *
#include <stdio.h>
#include <stdlib.h>
typedef struct data {
int a;
int b;
}data;
int main(){
data d, *p=&d;
return 0;
}
指标加上取值运算子,代表指标指向的变数,所以这个例子中的 d
等同 *p
因为 .
也是运算子,且优先级比 *
高,如果要从指标 p
取得变数 d
中的成员,*p
要加上括号,代表先取得 p
指向的变数,再从变数中取得成员
#include <stdio.h>
#include <stdlib.h>
typedef struct data {
int a;
int b;
}data;
int main(){
data d, *p=&d;
return 0;
}
或是用 ->
直接透过指标取得成员
#include <stdio.h>
#include <stdlib.h>
typedef struct data {
int a;
int b;
}data;
int main(){
data d={1, 2}, *p=&d;
printf("%d", p->a);
return 0;
}
类似阵列的资料结构,但比阵列更加灵活
其中的每个元(节点)至少有两个成员,一个是这个元的值,另一个是指向下个元的指标
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int val;
struct Node *next;
}node;
在一个清单中,常会宣告一个节点放在第一个节点之前,并透过这个节点取得後面的节点,最後一个节点会指向 NULL
,用来表示清单结束
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int val;
struct Node *next;
} node;
int main() {
node myList, a, b, c;
myList.next=&a;
a.val=1;
a.next=&b;
b.val=2;
b.next=&c;
c.val=3;
c.next=NULL;
return 0;
}
使用清单时,会宣告一个 node
的指标变数,指向目前查看的节点
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int val;
struct Node *next;
} node;
int main() {
node myList, a, b, c;
myList.next = &a;
a.val = 1;
a.next = &b;
b.val = 2;
b.next = &c;
c.val = 3;
c.next = NULL;
node *p = &myList;
for (; p != NULL;) {
p = p->next;
printf("%d ", p->val);
}
return 0;
}
结合 malloc()
可以任意新增清单中的节点
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int val;
struct Node *next;
} node;
int main() {
node myList, *p = &myList;
for (int i = 0; i != 10; i++) {
node *new = malloc(sizeof(node));
new->val = i;
p->next = new;
p = p->next;
}
p->next = NULL;
p = &myList;
while (p != NULL) {
p = p->next;
printf("%d ", p->val);
}
return 0;
}
要删除某个节点,只要把上一个节点的 next
改成下一个节点的指标,再用 free()
释放记忆体
下面例子中,删除第三个节点
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int val;
struct Node *next;
} node;
int main() {
node myList, *p = &myList;
for (int i = 0; i != 10; i++) {
node *new = malloc(sizeof(node));
new->val = i;
p->next = new;
p = p->next;
}
p->next = NULL;
p = &myList;
node *second = p->next->next, *third = p->next->next->next;
second->next=third->next;
free(third);
while (p != NULL) {
p = p->next;
printf("%d ", p->val);
}
return 0;
}
>>: 30天学会 Python: Day 29- 云端资料库
昨天 Day 12 介绍了 Sinopac PHP SDK 关於建立订单的部分,接着今天要介绍的是查...
所有权可以说是Rust核心概念,这让Rust不需要垃圾回收(garbage collector)就可...
来部落格看图文并茂文章 补觉鸣诗 那时对 cisco Router 的认识 大概就是 layer 3...
今日练习内容为建构CNN模型来分类鸟类图片,最後讲解一些架构的演进 # Load Data &...
tags: ItIron2021 Javascript 前言 昨天我们透过了一个相当经典的题目探讨了...