数据结构——链表

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 
  5 struct node
  6 {
  7     int data;
  8     struct node *pNext;
  9 };
 10 
 11 //新建node
 12 struct node * create_node(int data)
 13 {
 14     struct node *p = (struct node *) malloc (sizeof(struct node));
 15     
 16     if(NULL == p)
 17     {
 18         printf("malloc error!.\n");
 19         return NULL;
 20     }
 21     memset(p, 0, sizeof(struct node));
 22     p->data = data;
 23     p->pNext = NULL;
 24 
 25     return p;
 26 }
 27 
 28 //尾部插入
 29 void insert_tail(struct node *pH, struct node *newp)
 30 {
 31     struct node * p = pH;
 32     while(NULL != p->pNext)
 33     {
 34         p = p->pNext;
 35     }
 36     p->pNext = newp;
 37 }
 38 
 39 //头部插入
 40 void insert_head(struct node * pH, struct node *newp)
 41 {
 42     newp->pNext = pH->pNext;
 43     pH->pNext = newp;
 44 }
 45 
 46 //excluding header data
 47 //不能打印头结点
 48 void list_for_each_1(struct node *pH)
 49 {
 50     struct node *p = pH->pNext;
 51     printf("------------begin------------\n");
 52     while(NULL != p->pNext)
 53     {
 54         printf("node data : %d.\n", p->data);
 55         p = p->pNext;
 56     }
 57     printf("node data : %d.\n", p->data);
 58     printf("------------end------------\n");
 59 }
 60 
 61 //excluding header data version 2 simplify
 62 //不能打印头结点,版本优化
 63 void list_for_each_3(struct node *pH)
 64 {
 65     struct node *p = pH;
 66     printf("------------begin------------\n");
 67     while(NULL != p->pNext)
 68     {
 69         p = p->pNext;
 70         printf("node data : %d.\n", p->data);
 71     }
 72     printf("------------end------------\n");
 73 }
 74 
 75 //including header data
 76 //能打印头结点
 77 int list_for_each_2(struct node *pH)
 78 {
 79     struct node *p = pH;
 80     printf("------------begin------------\n");
 81     if(NULL == p)
 82     {
 83         printf("nothing.\n");
 84         return -1;
 85     }
 86     while(NULL != p->pNext)
 87     {
 88         printf("node data : %d.\n", p->data);
 89         p = p->pNext;
 90     }
 91     printf("node data : %d.\n", p->data);
 92     printf("------------end------------\n");
 93     return 0;
 94 }
 95 
 96 //can not delete header node data
 97 //不能删除头结点
 98 int delete_node(struct node * pH, int data)
 99 {
100     struct node *p = pH;
101     struct node *pPrev = NULL;
102     while(NULL != p->pNext)
103     {
104         pPrev = p;
105         p = p->pNext;
106         if(p->data == data)
107         {
108             if(NULL == p->pNext)
109             {
110                 pPrev->pNext = NULL;
111                 free(p);
112             }
113             else
114             {
115                 pPrev->pNext = p->pNext;
116                 free(p);
117             }
118             return 0;
119         }
120     }
121     printf("no node deleted.\n");
122     return -1;
123 }
124 
125 //can delete all node including the tail node and header node
126 //能删除头结点和尾节点
127 struct node * delete_node_2(struct node * pH, int data)
128 {
129     struct node *p = pH;
130     struct node *pPrev = NULL;
131     pPrev = p;
132     while(NULL != p) //traserval to tail
133     {
134         if(p->data == data)
135         {
136             //delete header node
137             if(p->data == pH->data)
138             {
139                 pH = p->pNext;
140                 free(p);
141                 printf("node %d deleted ok.\n",data);
142                 return pH; //delete ok!
143             }
144             else
145             {
146                 //delete tail node
147                 if(NULL == p->pNext)
148                 {
149                     pPrev->pNext = NULL;
150                     free(p);
151                 }
152                 else
153                 {
154                     pPrev->pNext = p->pNext;
155                     free(p);
156                 }
157                 printf("node %d deleted ok.\n",data);
158                 return pH;
159             }
160             printf("node %d deleted ok.\n",data);
161         }
162         pPrev = p;
163         p = p->pNext;
164     }
165     return pH;
166 }
167 
168 
169 int main()
170 {
171     struct node * pHeader = create_node(1);
172     printf("Hello world!\n");
173 
174     insert_tail(pHeader, create_node(2));
175     insert_tail(pHeader, create_node(3));
176     insert_head(pHeader, create_node(4));
177     insert_head(pHeader, create_node(5));
178     list_for_each_2(pHeader);
179     pHeader = delete_node_2(pHeader, 3);
180     pHeader = delete_node_2(pHeader, 2);
181     pHeader = delete_node_2(pHeader, 5);
182     pHeader = delete_node_2(pHeader, 4);
183     pHeader = delete_node_2(pHeader, 1);
184     list_for_each_2(pHeader);
185 //    printf("1 = %d\n",pHeader->data);
186 //    printf("2 = %d\n",pHeader->pNext->data);
187 //    printf("3 = %d\n",pHeader->pNext->pNext->data);
188 //    printf("4 = %d\n",pHeader->pNext->pNext->pNext->data);
189 //    printf("5 = %d\n",pHeader->pNext->pNext->pNext->pNext->data);
190 
191     return 0;
192 }

 

posted @ 2018-09-08 20:14  wdliming  阅读(235)  评论(0编辑  收藏  举报