刪除鏈表之two star programming

最近偶爾看到一篇關於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

相關文章
相關標籤/搜索