C言語、単一チェーンテーブル操作(添削・変更)(version 0.1)

53456 ワード

この日は面接なので、事前にチェーンテーブルの操作を書き直しました.必要に応じてバックアップします.
誰かがこのコードを見て、指摘してほしい.
 
 1 //  File Name     : list.h
 2 #include "stdafx.h"
 3 #include "stdio.h"
 4 #include <stdlib.h>
 5 #include "string.h"
 6  
 7 //creat list
 8 //creat node 
 9 //insert
10 //del
11 //find
12 //sort
13 typedef int data_t ;
14 typedef struct NODE{
15     data_t data;
16     NODE* next;
17 }NODE ,*NODEPTR;
18 
19 typedef struct LIST{
20     NODE* head;//init==0
21     NODE* tail;//init==0
22     int num ;  //min==0
23 }LIST;
24 
25 //create
26 extern NODE *create_node(data_t data);
27 extern LIST *creat_list();
28 extern bool is_null(LIST* list);
29 //find
30 extern NODE* find_node(LIST* list ,data_t data);
31 extern NODE* inline find_node_by_index(LIST* list , int index);//index : from 1 to list->num
32 
33 //del
34 extern int del_node_data(LIST* list,data_t data);
35 extern data_t del_node_head(LIST* list );
36 extern data_t del_node_index(LIST* list,int index);//index : from 1 to list->num
37 extern data_t del_node_tail(LIST* list );
38 
39 //insert
40 extern int insert_data_F(LIST* list, data_t data);
41 extern void insert_node_F(LIST* list, NODE* node);
42 extern int insert_data_T(LIST* list, data_t data);
43 extern void insert_node_T(LIST* list, NODE* node );
44 extern int insert_data_index(LIST* list , data_t data,int index);//index : from 1 to list->num
45 extern int insert_node_index(LIST* list , NODE* node,int index);//index : from 1 to list->num
46 
47 extern int insert_data_ordered(LIST* list , data_t data );//assume the list is ordered (low to high )48 
49 //sort
50 extern int sort(LIST* list);
51 extern int swap(LIST* list, int indexf,int indexn);//index : from 1 to list->num
52 extern int inline swap_node(NODE* before ,NODE* next);
53  
  1 /******************************************************************************
  2 
  3   Copyright (C), 2001-2011, DCN Co., Ltd.
  4 
  5  ******************************************************************************
  6   File Name     : list.c
  7   Version       : Initial Draft
  8   Author        : ocj
  9   Created       : 2014/8/8
 10   Last Modified :
 11   Description   : singlelist
 12   Function List :
 13               create_node
 14               creat_list
 15               del_node_data
 16               del_node_head
 17               del_node_index
 18               del_node_tail
 19               find_node
 20               find_node_by_index
 21               insert_data_F
 22               insert_data_index
 23               insert_data_ordered
 24               insert_data_T
 25               insert_node_F
 26               insert_node_index
 27               insert_node_T
 28               is_null
 29               sort
 30               swap
 31               swap_node
 32   History       :
 33   1.Date        : 2014/8/8
 34     Author      : ocj
 35     Modification: Created file
 36 
 37 ******************************************************************************/
 38 #include "list.h"
 39 //if success :ret!=0
 40 LIST *creat_list()
 41 {
 42     LIST* list = (LIST*)malloc(sizeof(LIST));
 43     list->head = 0;
 44     list->tail = 0;
 45     list->num = 0;
 46     return list;
 47 }
 48 //if success :ret!=0
 49 NODE *create_node(data_t data)
 50 {
 51     NODE* node = (NODE*)malloc(sizeof(NODE)); 
 52     node->dext = 0;
 53     node.data = data;
 54     return node;
 55 }
 56 
 57 //return 1: is null
 58 //return 0: not null
 59 bool is_null(LIST* list)
 60 {
 61     //return (list->num==0); //method 1 
 62     return (list->head->next == 0 )    ;//method 2
 63 }
 64 
 65 //ret==0:fail
 66 int insert_node_F(LIST* list, NODE* node)
 67 {
 68     if(list==0 || node ==0){
 69         return 0;
 70     }
 71     if(list->head==0){
 72         list->tail = node;
 73     }
 74     list->head = node ;
 75     node->next = list->head;
 76 //if list is null     ,node->next == list->head==0
 77 //if list is not null ,node->next == list->head!=0
 78     list->num++;  
 79 }
 80 
 81 //return 1 : ok
 82 //return 0 : fail
 83 int insert_data_F(LIST* list, data_t data)
 84 {
 85     NODE* node = create_node(data);
 86     if(node){
 87         return 0;
 88     }
 89     insert_node_F(list , node);
 90     return 1;
 91 }
 92 
 93 void insert_node_T(LIST* list, NODE* node )
 94 {
 95     if(list->head==0){
 96         node->next = 0;
 97         list->head = list->tail = node;
 98     }
 99     
100     list->tail = node ;
101     node->next = 0 ;
102     list->num++;
103 }
104 
105 //return 1 : ok
106 //return 0 : fail
107 int insert_data_T(LIST* list, data_t data)
108 {
109     NODE* node = create_node(data);
110     if(node){
111         return 0;
112     }
113     insert_node_T(list , node);
114     return 1;
115 }
116 
117 //ret=0: fail
118 int insert_node_index(LIST* list , NODE* node,int index)
119 {
120     if(index>listnum+1)    {
121         return 0;
122     }
123         
124     if(index==1){
125         insert_node_F(list ,node);
126     }else if(index ==list->num+1){
127         insert_node_T(list ,node);
128     }else{
129         NODE* before = list->head;
130         while(index>2){
131             index--;
132             before = before->next;        
133         }
134         node->next = before->next ;
135         before->next = node ;
136         list->num++;
137     }
138     return 1;
139 }
140 //ret=0: fail
141 int insert_data_index(LIST* list , data_t data,int index)
142 {
143     NODE* node = create_node(data)    ;
144     if(node==null){
145         return 0 ;
146     }
147     return insert_node_index(list , node,index );
148 }
149 
150 //assume the order is low to high
151 //ret==0: fail
152 int insert_data_ordered(LIST* list , data_t data )
153 {
154     NODE* node = create_node(data);
155     if(node==0){
156         return 0;
157     }
158     if(list->head == 0){
159         list->head = list->tail = node;
160         return 1;
161     }
162     
163     if(node->data < head->data){
164         insert_data_F(list ,node);
165     }else {
166         list->num++;
167         NODE *before = head;
168         NODE* nodet = head->next ;
169         while(node->data > nodet->data && nodet->next!=0){
170          //until( node->data < nodet->data  || tail )
171             nodet = nodet->next ;
172             before = before->next;    
173         }
174         if(nodet->next==0){
175             nodet->next = node ;
176         }else{
177             node->next = nodet ;
178             before->next = node ;
179         }
180     }
181     return 1;
182 }
183 
184 //not find: return 0
185 //success find and del :return 1 
186 int del_node_data(LIST* list,data_t data)  //find and del first_found
187 {
188     if(list->num ==0){
189         return 0;
190     }
191     
192     NODE* before = list->head ;    
193     NODE* nodet = list->head ;    
194     if(nodet->data == data){ //head->data == data
195         list->head = list->head->next ;
196         free(nodet);
197         list->num--;
198         return 1;
199     }
200     
201     nodet = nodet->next;
202     while(nodet->data!=data  && nodet->next!=0  ){
203         nodet = nodet->next;
204     }
205     if(nodet->data == data ){
206         before->next = nodet->next ;
207         free(nodet);
208         list->num--;
209     }else{//not found
210         return 0;
211     }
212     return 1;
213 }
214 
215 
216 data_t del_node_index(LIST* list,int index)
217 {
218     if(is_null(list) || index > list->num){
219         exit(-1);
220     }
221     NODE* before = list->head ;
222     NODE* del = list->head ;
223     data_t data ;
224     if(list->num == 1 )    { //head
225         list->num--;
226         list->head = list->tail = 0; 
227         data = del->data;
228         free(del);
229         return data;
230     }
231     
232     int first = 1 ;
233     for( ;index>1;index--){//offset --- index   
234         if(!first){
235             before = before->next ;
236         }
237         first = 0;
238         del = del->next;
239     }
240     
241     before->next = del->next ;
242     data = del->data;
243     if(del==list->tail){
244         list->tail = before ;    
245     }
246     free(del);
247     list->num--;
248     return data;
249 
250 } 
251 data_t del_node_head(LIST* list )
252 {
253     if(is_null(list)){
254         exit(-1) ;
255     }
256     data_t data ;
257     NODE* del = list->head ;
258     list->head = list->head->next ;
259     free(del);
260     list->num--;
261     return data;
262 }
263 data_t del_node_tail(LIST* list )
264 {
265     if(is_null(list)){
266         exit(-1) ;
267     }
268     NODE *before = list->head  ;
269     data_t data = list->tail->data;
270             
271     if(list->num ==1){
272         list->head = list->tail = 0;
273         list->num--;
274         free(before);
275         return data ;
276     }
277 
278     while(before->next!=0 && before->next->next != 0)    {
279         before = before->next ;
280     }
281     
282     list->tail = before;
283     list->num--;
284     free(before->next);
285     return data ;
286 }
287 
288 //return 0: fail to find 
289 //return node* : node first_found
290 NODE* find_node(LIST* list ,data_t data)
291 {
292     if(is_null(list)){
293         return 0 ;
294     }
295     
296     NODE* nodet = list->head;
297     do{
298         if(nodet->data == data)
299             return nodet;
300     }while(nodet->next!=0);
301 
302     return 0;
303 }
304 
305 //head_index == 1;
306 //return 0: fail to find 
307 //return node* : node first_found
308 NODE* inline find_node_by_index(LIST* list , int index)
309 {
310     if(list==0 || list->num ==0 || index > list->num){
311         return 0;
312     }
313     NODE* find = list->head;
314     while(--index){
315         find =find->next; 
316     }
317     return find ;
318 }
319 
320 int swap(LIST* list, int indexf,int indexn)
321 {
322     NODE* nodef = find_node( list , indexf ) ;
323     NODE* noden = find_node( list , indexn ) ;
324     data_t swp = nodef->data;
325     nodef->data = noden->data;
326     noden->data = swp->data;
327 }
328 
329 //ret==0 : fail
330 int inline swap_node(NODE* before ,NODE* next)
331 {
332     if(before == 0 ||next == 0){
333         return 0;
334     }
335     before->data ^=next->data ;
336     next->data      ^=before->data ;
337     before->data ^=next->data ;
338 }
339 
340 //asume from little to big
341 int sort(LIST* list)
342 {
343     int times;
344     int index;
345     NODE* before = list->head;
346     NODE* next =  0;    
347     if(list==0){
348         return 0;
349     }
350     if(list->num==0){
351         return 1 ;
352     }
353     for(times=0;times<list->num ;times++){
354         for(index=1;index<=size-times;index++){
355             before = find_node_by_index(list ,index);
356             next = before->next;
357             if(next->data<before->data){
358                 //before->data = before->data^ next->data ;            
359                 //nexty->data  = before->data^ next->data ;            
360                 //before->data = before->data^ next->data ;
361                 swap_node(before , next);
362             }
363     }
364     return 1;    
365 }