单链表的数据结构以及方法的定义在.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 }