单链表的数据结构以及方法的定义在.h文件中
#ifndef _LINK_LIST_H_
#define _LINK_LIST_H_
#define ERROR -1
typedef int elem_type;
typedef struct _NODE
{
elem_type data;
struct _NODE *next;
}NODE;
typedef struct _HEADNODE
{
int len;
struct _NODE *next;
struct _NODE *tail;
}HEADNODE;
HEADNODE *init_link_list_ex();
bool destory_link_list(HEADNODE *phead);
int get_length(HEADNODE *phead);
bool show(HEADNODE *phead);
bool is_empty(HEADNODE *phead);
bool insert_head(HEADNODE *phead,elem_type e);
bool insert_tail(HEADNODE *phead,elem_type e);
bool delete_head(HEADNODE *phead,elem_type *e);
bool delete_tail(HEADNODE *phead,elem_type *e);
#endif
方法的具体实现
1 #include "LINK_LIST_EX.h" 2 #include<stdio.h> 3 #include<stdlib.h> 4 static NODE *alloc_node(elem_type e) 5 { 6 NODE *tmp = (NODE *)malloc(sizeof(NODE) * 1); 7 if (tmp == NULL) 8 { 9 return NULL; 10 } 11 tmp->data = e; 12 tmp->next = NULL; 13 14 return tmp; 15 } 16 17 HEADNODE *init_link_list_ex() 18 { 19 HEADNODE *phead = (HEADNODE *)malloc(sizeof(NODE) * 1); 20 phead->len = 0; 21 phead->next = NULL; 22 phead->tail = NULL; 23 24 return phead; 25 } 26 27 bool destory_link_list(HEADNODE *phead); 28 29 30 int get_length(HEADNODE *phead) 31 { 32 return phead->len; 33 } 34 35 bool show(HEADNODE *phead) 36 { 37 int len = get_length(phead); 38 NODE *p = phead->next; 39 40 for (int i=0;i<len;i++) 41 { 42 printf("%d ",p->data); 43 p = p->next; 44 } 45 return true; 46 } 47 48 bool is_empty(HEADNODE *phead) 49 { 50 //return phead->next == NULL; 51 return phead->len == 0; 52 } 53 54 55 bool insert_head(HEADNODE *phead,elem_type e) 56 { 57 NODE *tmp = alloc_node(e); 58 59 if (is_empty(phead)) 60 { 61 phead->tail = tmp; 62 } 63 64 tmp->next = phead->next; 65 phead->next = tmp; 66 67 phead->len++; 68 return true; 69 } 70 71 bool insert_tail(HEADNODE *phead,elem_type e) 72 { 73 NODE *tmp = alloc_node(e); 74 phead->tail->next = tmp; 75 phead->tail = tmp; 76 77 phead->len++; 78 return true; 79 } 80 81 82 bool delete_head(HEADNODE *phead,elem_type *e) 83 {//如果剩最后一个结点,删除时需要注意控制尾指针 84 85 if(phead->next->next == NULL) 86 { 87 *e = phead->next->data ; 88 free(phead->next); 89 phead->tail = NULL; 90 phead->len --; 91 return true; 92 93 } 94 NODE *tmp = alloc_node(*e); 95 tmp = phead->next; 96 phead->next = tmp->next ; 97 *e = tmp->data ; 98 free(tmp); 99 100 phead->len--; 101 } 102 103 NODE *get_sec_last(HEADNODE *phead) 104 { 105 if(phead == NULL) 106 { 107 return NULL; 108 } 109 if(is_empty(phead)) 110 { 111 return NULL; 112 } 113 NODE *p = phead->next; 114 NODE *s = phead->next; 115 while(p->next !=NULL) 116 { 117 s=p; 118 p = p->next ; 119 } 120 return s; 121 122 } 123 bool delete_tail(HEADNODE *phead,elem_type *e) 124 { 125 //如果剩最后一个结点,删除时需要注意控制尾指针 126 if(phead->next->next == NULL) 127 { 128 *e = phead->next->data ; 129 free(phead->next); 130 phead->tail = NULL; 131 phead->len --; 132 return true; 133 134 } 135 NODE *tmp = alloc_node(*e); 136 tmp = get_sec_last(phead) ; 137 *e = tmp->data ; 138 free(tmp->next->next); 139 tmp->next = NULL; 140 phead->tail = tmp; 141 p->len--; 142 143 return true; 144 145 }