清单 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 只是提供了一些简单,强大而通用的能力,至于你想将其搭成什么样的积木,则全靠你自己了。