链表的删除【转】
转自:http://www.cnblogs.com/rain-lei/p/3590561.html
最近偶尔看到一篇关于Linus Torvalds的访问,大神说大部分人都不理解指针。假设被要求写一段链表删除节点的程序,大多数的做法都是跟踪两个指针,当前指针cur和其父节点pre,这种实现很容易理解,但是并没有用到指针的精髓。
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; }
原作者有示例图分析,我就不转了。
先mark下。自己研究下。。