c语言单链表

Posted on 2012-05-14 13:41  逝水如年  阅读(300)  评论(0)    收藏  举报
 1 /*linklist.h*/
 2 #ifndef LINKLIST_H
 3 #define LINKLIST_H
 4 //定义节点指针
 5 typedef struct node *link;
 6 //节点数据结构
 7 struct node {
 8     unsigned char item;
 9     link next;
10 };
11 //创建节点
12 link make(unsigned char item);
13 //释放节点内存
14 void free_node(link);
15 //查找节点
16 link search(unsigned char);
17 //删除节点
18 void delete(link);
19 //执行回调函数
20 void traverse(void (*visit)(link));
21 //销毁链表
22 void destroy(void);
23 //压入
24 void push(link);
25 //弹出
26 link pop(void);
27 #endif
  1 /*linklist.c*/
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 #include "linklist.h"
  5 static link head = NULL;
  6 /**
  7  * 功能:创建节点
  8  * return:link
  9  */
 10 link make_node(unsigned char item)
 11 {
 12     //分配内存
 13     link p = malloc(sizeof *p);
 14     p->item = item;
 15     p->next = NULL;
 16     return p;
 17 }
 18 
 19 /**
 20  * 功能:释放节点内存
 21  * return:void
 22  */
 23 void free_node(link p)
 24 {
 25     free(p);
 26 }
 27 
 28 /**
 29  * 功能:查找节点
 30  * return:link
 31  */
 32 link search(unsigned char key)
 33 {
 34     link p;
 35     for(p = head; p; p = p->next) {
 36         if(p->item == key){
 37             return p;
 38         }
 39     }
 40     return NULL;
 41 }
 42 
 43 /**
 44  * 功能:插入节点
 45  * return:void
 46  */
 47 void insert(link p)
 48 {
 49     p->next = head;
 50     head = p;
 51 }
 52  
 53 /**
 54  * 功能:删除节点
 55  * return:void
 56  */
 57 void delete(link p)
 58 {
 59     link pre;
 60     if (p == head) {
 61         head = p->next;
 62         return;
 63     }
 64     for (pre = head; pre; pre = pre->next)
 65     {
 66         if(pre->next == p) {
 67             pre->next = p->next;
 68             return;
 69         }
 70     }
 71 }
 72 
 73 /**
 74  * 功能:执行回调函数
 75  * return:void
 76  */
 77 void traverse(void (*visit)(link))
 78 {
 79     link p;
 80     for (p = head; p; p = p->next)
 81     {
 82          visit(p);
 83     }
 84    
 85 }
 86 
 87 /**
 88  * 功能:销毁链表
 89  * return:void
 90  */
 91 void destroy(void)
 92 {
 93     link q,p;
 94     p = head;
 95     head = NULL;
 96     while (p)
 97     {
 98         q = p;
 99         p = p->next;
100         free_node(q);
101     }
102 }
103 
104 /**
105  * 功能:压入
106  * return:void
107  */
108 void push(link p)
109 {
110     insert(p);
111 }
112 
113 /**
114  * 功能:弹出
115  * return:void
116  */
117 link pop(void)
118 {
119     if(head == NULL){
120         return NULL;
121     } else {
122         link p = head;
123         head = head->next;
124         return p;
125     }
126 }
 1 #include <stdio.h>
 2 #include "linklist.h"
 3 void print_item (link p)
 4 {
 5     printf("%d\n",p->item);
 6 }
 7 int main()
 8 {
 9     link p = make_node(10);
10     insert(p);
11     p = make_node(5);
12     insert(p);
13     p = make_node(90);
14     insert(p);
15     delete(p);
16     free_node(p);
17     traverse(print_item);
18     destroy();
19     return 1;
20 }

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3