30天学会C语言: Day 29-串起来!!!

NULL

常数 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;
}

清单(Linked List)

类似阵列的资料结构,但比阵列更加灵活
其中的每个元(节点)至少有两个成员,一个是这个元的值,另一个是指向下个元的指标

#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;
}


<<:  Day-30 不知不觉面试题完赛!感谢大家!

>>:  30天学会 Python: Day 29- 云端资料库

Day 13 - PHP SDK: 查询订单状态

昨天 Day 12 介绍了 Sinopac PHP SDK 关於建立订单的部分,接着今天要介绍的是查...

Rust-所有权(一)

所有权可以说是Rust核心概念,这让Rust不需要垃圾回收(garbage collector)就可...

day2 CCNA -2 what is router (雷)硬体也要分 license

来部落格看图文并茂文章 补觉鸣诗 那时对 cisco Router 的认识 大概就是 layer 3...

Day32 参加职训(机器学习与资料分析工程师培训班),tf.keras

今日练习内容为建构CNN模型来分类鸟类图片,最後讲解一些架构的演进 # Load Data &...

每日挑战,从Javascript面试题目了解一些你可能忽略的概念 - Day2

tags: ItIron2021 Javascript 前言 昨天我们透过了一个相当经典的题目探讨了...