iT邦幫忙

2021 iThome 鐵人賽

DAY 30
0
Software Development

0基礎也看得懂的程式設計-30天學會C語言系列 第 30

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


上一篇
30天學會C語言: Day 28-指標&陣列
系列文
0基礎也看得懂的程式設計-30天學會C語言30

尚未有邦友留言

立即登入留言