清单 3. 插入及删除
// 将一个 node 插入到一个 list 对象上
void insert(void *node){ 
Node *current = (Node*)malloc(sizeof(Node)); 
current->data = node; 
current->next = list->_this->head->next; 
list->_this->head->next = current; 
(list->_this->size)++; 
} 
// 删除一个指定的节点 node 
void drop(void *node){ 
Node *t = list->_this->head; 
Node *d = NULL; 
int i = 0; 
for(i;i < list->_this->size;i++){ 
d = list->_this->head->next; 
if(d->data == ((Node*)node)->data){ 
list->_this->head->next = d->next; 
free(d); 
(list->_this->size)--; 
break; 
}else{ 
list->_this->head = list->_this->head->next; 
} 
} 
list->_this->head = t; 
}  
其他的实现代码可以参看下载部分,这里限于篇幅就不再意义列举出来。
测试
测试代码
好了,前面做的一切工作都是为了保证我们的暴露给使用者的 API 可以尽量的简洁,优美,现在到测试的时候了:
清单 4. 测试代码
int main(int argc, char** argv) { 
List *list = (List*)ListConstruction();// 构造一个新的链表
// 插入一些值做测试
list->insert("Apple"); 
list->insert("Borland"); 
list->insert("Cisco"); 
list->insert("Dell"); 
list->insert("Electrolux"); 
list->insert("FireFox"); 
list->insert("Google"); 
list->print();// 打印整个列表
printf("list size = %d\n",list->getSize());
Node node; 
node.data = "Electrolux"; 
node.next = NULL; 
list->drop(&node);// 删除一个节点
node.data = "Cisco"; 
node.next = NULL; 
list->drop(&node);// 删除另一个节点
list->print();// 再次打印
printf("list size = %d\n",list->getSize()); 
list->clear();// 清空列表
return 0; 
} 
图 1. 运行结果

运行结果
结束语
C 语言所诞生的UNIX平台提倡这样一种设计哲学:尽量进行简单的设计,让使用者如同搭积木一样的将这些简单的工具连接成强大的,完整的应用。 应该说,C 比较好的继承了这一点,C 语言非常简洁,非常强大,而由于 C 语言诞生的比较早,当时的面向对象的思想还不成熟,所以出现了大量的过程式的 C 应用,从而给人们一种 C 语言是面向过程的语言的错觉,其实 C 只是提供了一些简单,强大而通用的能力,至于你想将其搭成什么样的积木,则全靠你自己了。
