============================================================================ Name : TestLinkedList.c Author : lf Version : Copyright : Your copyright notice Description : 1 单链表的增删改查等操作 2 函数指针的使用.如示例中的:void (*visit)(link) ============================================================================ */ #include <stdio.h> #include <stdlib.h> #include "Linkedlist.h" //打印结点 void printNode(link p){ printf("%d\n",p->item); } int main(void) { //插入结点 link p = makeNode(10); insertNode(p); p = makeNode(8); insertNode(p); p = makeNode(6); insertNode(p); //遍历结点 traverse(printNode); //查找结点 link searchResult=searchNode(8); printf("%s","searchResult:"); printNode(searchResult); //删除结点 link deleteResult=deleteNode(searchResult); freeNode(deleteResult); traverse(printNode); printf("delete finish \n"); //更新结点 updateNode(6,99); traverse(printNode); printf("update finish \n"); //销毁链表 destroyLinkedlist(); return EXIT_SUCCESS; }
/* ============================================================================ Name : Linkedlist.h Author : lf Version : Copyright : Your copyright notice 注意的问题 : 头文件(.h)的书写格式和惯例,比如此处头文件为Linkedlist.h,所以这么写: #ifndef LINKEDLIST_H #define LINKEDLIST_H .................. .................. .................. #endif ============================================================================ */ #ifndef LINKEDLIST_H #define LINKEDLIST_H typedef struct node *link; struct node { unsigned char item; link nextNode; }; //生成新的结点 link makeNode(unsigned char item); //释放(free)结点 void freeNode(link p); //向链表中插入结点 void insertNode(link p); //删除链表中的结点 link deleteNode(link p); //遍历链表 void traverse(void (*visit) (link)); //查找结点 link searchNode(unsigned char key); //更新结点 void updateNode(unsigned char oldKey,unsigned char newKey); //销毁链表 void destroyLinkedlist(); #endif
/* ============================================================================ Name : LinkedList.c Author : lf Version : Copyright : Your copyright notice 注意的细节 : 包含系统的头文件用的是<>包含自己的头文件用的是"" ============================================================================ */ #include <stdio.h> #include <stdlib.h> #include "Linkedlist.h" static link head = NULL; link makeNode(unsigned char item) { link p; p = malloc(sizeof *p); p->item = item; p->nextNode = NULL; return p; } void insertNode(link p) { p->nextNode = head; head = p; } //删除链表中的结点 link deleteNode(link p) { //删除的是头结点 if (p == head) { head = p->nextNode; return p; } //删除的是除头结点以外的结点 link preNode; for (preNode = head; preNode; preNode = preNode->nextNode) { if (preNode->nextNode == p) { preNode->nextNode = p->nextNode; return p; } } return NULL; } void freeNode(link p) { free(p); } /** * 遍历链表. * 注意此处的函数指针: * void (*visit)(link) * 函数的输入参数是link类型,返回值是void * 所以一般写成: 返回值 (*函数名)(输入参数) */ void traverse(void (*visit)(link)) { link p = NULL; for (p = head; p; p = p->nextNode) { visit(p); } } link searchNode(unsigned char key) { link p = NULL; for (p = head; p; p = p->nextNode) { if (p->item == key) { return p; } } return NULL; } void updateNode(unsigned char oldKey, unsigned char newKey) { link p = NULL; for (p = head; p; p = p->nextNode) { if (p->item == oldKey) { p->item = newKey; } } } void destroyLinkedlist(){ link q; link p=head; head=NULL; while(p){ q=p; p=p->nextNode; freeNode(q); } }