最近偶爾看到一篇關於Linus Torvalds的訪問,大神說大部分人都不理解指針。假設被要求寫一段鏈表刪除節點的程序,大多數的作法都是跟蹤兩個指針,當前指針cur和其父節點pre,這種實現很容易理解,可是並無用到指針的精髓。node
Linus是怎麼寫的呢,且看源代碼編程
//鏈表之two star programming #include <stdio.h> typedef struct node { int value; struct node *next; }listNode; listNode *insert(listNode *head, int value) { listNode *newNode = new listNode; newNode->value = value; newNode->next = head; return newNode; } void erase(listNode **head_in, int value) { listNode **cur = head_in; while (*cur) { listNode *p = *cur; if (p->value == value) { *cur = p->next; delete p; } else { cur = &(p->next); } } //return head; } void printList(listNode *head) { listNode *p = head; while(p) { printf("%d ", p->value); p = p->next; } printf("\n"); } int main() { listNode *head = NULL; int select, a; do { printf("請輸入選擇 1--插入, 2--刪除, 3--輸出,其餘跳出\n"); scanf("%d", &select); if(select == 1) { printf("輸入將要插入的值, -1表示結束\n"); while(scanf("%d", &a), a != -1) { head = insert(head, a); } } else if(select == 2) { printf("輸入將要刪除的值, -1表示結束\n"); while(scanf("%d", &a), a != -1) { erase(&head, a); } } else if(select == 3) { printList(head); } else break; } while (1); getchar(); return 0; }
運行結果函數
在鏈表的刪除節點函數earse()中,並非把頭結點指針head做爲參數傳入,而是傳入指針head的引用,小雨來分析一下運行過程,直接上圖說明操作系統
能夠看出cur的移動比較有意思,它是沿着節點之間的指針移動的,在這裏,咱們也能夠把指針當成一種特殊的節點。指針
固然如今並不提倡這種編程風格,雖然看起來很簡潔,可是太晦澀,不能讓人一眼看懂,Linus說通常操做系統核心部分用這種方式。blog