2、在第 2.11 节 “本节综合练习”的习题1中规定了一种日志文件的格式,每行是一条记录,由行号、日期、时间三个字段组成,由于记录是按时间先后顺序写入的,可以看作所有记录是按日期排序的,对于日期相同的记录再按时间排序。现在要求从这样的一个日志文件中读出所有记录组成一个链表,在链表中首先按时间排序,对于时间相同的记录再按日期排序,最后写回文件中。比如原文件的内容是:
1 2009-7-30 15:16:42 2 2009-7-30 15:16:43 3 2009-7-31 15:16:41 4 2009-7-31 15:16:42 5 2009-7-31 15:16:43 6 2009-7-31 15:16:44
重新排序输出的文件内容是:
1 2009-7-31 15:16:41 2 2009-7-30 15:16:42 3 2009-7-31 15:16:42 4 2009-7-30 15:16:43 5 2009-7-31 15:16:43 6 2009-7-31 15:16:44
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 #include "dlink_log.h" 5 #include <string.h> 6 7 int get_i(FILE *fp, char *name); 8 int main(int argc, char *arg[]) 9 { 10 if(argc>2){ 11 printf("the arg[1] is %s\n", arg[1]); 12 FILE *fp = fopen(arg[1], "r"); 13 if(fp == NULL) { 14 perror("Open file abcde"); 15 }else{ 16 get_i(fp, arg[2]); 17 } 18 fclose(fp); 19 } 20 21 22 23 } 24 25 int get_i(FILE *fp, char *name) 26 { 27 char *a = malloc(sizeof(char)); 28 int num=0; 29 link node; 30 while(fgets(a, 100, fp) != NULL){ 31 char *y=malloc(sizeof(char)), *d =malloc(sizeof(char)); 32 printf("line----------------%s\n", a); 33 sscanf(a, "%d %s %s", &num, y, d); 34 printf("==========sum=%d y=%s d=%s\n", num, y, d); 35 node = make_node(num, y, d); 36 printf("==========node->day=%s\n", node->day); 37 insert_sort(node); 38 } 39 list_node(); 40 FILE *fp1 = fopen(name, "w+"); 41 re_write(fp1); 42 fclose(fp1); 43 return num; 44 } 45 46
1 /* dlink_log.h */ 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 #ifndef DOUBLYLINKEDLIST_H 6 #define DOUBLYLINKEDLIST_H 7 8 typedef struct node *link; 9 struct node { 10 int num; 11 char *date; 12 char *day; 13 link pre, next; 14 }; 15 16 link make_node(int num, char *date, char *day); 17 void free_node(link p); 18 void insert(link p); 19 void delete(link p); 20 void traverse(void (*visit)(link)); 21 void destroy(void); 22 void enqueue(link p); 23 link dequeue(void); 24 void insert_sort(link p); 25 void list_node(void); 26 int lg(link a, link b); 27 void re_write(FILE *fp); 28 29 #endif
/* dlink_log.c */ 2 #include <stdlib.h> 3 #include <stdio.h> 4 #include "dlink_log.h" 5 #include "string.h" 6 7 struct node tailsentinel; 8 struct node headsentinel = {0, NULL, NULL, NULL, &tailsentinel}; 9 struct node tailsentinel = {0, NULL, NULL, NULL, &headsentinel}; 10 static link head = &headsentinel; 11 static link tail = &tailsentinel; 12 13 link make_node(int num, char *date, char *day) 14 { 15 link p = malloc(sizeof *p); 16 p->num = num; 17 p->date = date; 18 p->day = day; 19 p->pre = p->next = NULL; 20 return p; 21 } 22 23 void free_node(link p) 24 { 25 free(p); 26 } 27 28 int lg(link node, link p) 29 { 30 int r; 31 printf("num=%d, node->day=%s, num=%d,p->day=%s\n", 32 node->num, node->day, p->num, p->day); 33 r = strcmp(node->day, p->day); 34 //r = node->num > p->num; 35 printf("r=%d\n", r); 36 r = r>=0; 37 printf("r=%d\n", r); 38 return r; 39 } 40 41 42 void insert_sort(link p) 43 { 44 printf("insert_sort p->day=%s\n", p->day); 45 link node = head; 46 for(;node->next != tail && lg(node->next, p); node=node->next); 47 //for(;node->next != tail && node->next->num < p->num; node=node->next); 48 p->next = node->next; 49 p->pre = node; 50 node->next->pre=p; 51 node->next = p; 52 } 53 54 55 void insert(link p) 56 { 57 p->next = head->next; 58 head->next->pre = p; 59 head->next = p; 60 p->pre = head; 61 } 62 63 void delete(link p) 64 { 65 p->pre->next = p->next; 66 p->next->pre = p->pre; 67 } 68 69 void traverse(void (*visit)(link)) 70 { 71 link p; 72 for(p=head->next; p!=tail; p=p->next){ 73 visit(p); 74 } 75 } 76 77 78 void destroy(void) 79 { 80 link q, p = head->next; 81 head->next = tail; 82 tail->pre = head; 83 while(p!=tail){ 84 q = p; 85 p=p->next; 86 free_node(q); 87 } 88 } 89 90 void enqueue(link p) 91 { 92 insert(p); 93 } 94 95 link dequeue(void) 96 { 97 if(tail->pre ==head){ 98 return NULL; 99 }else{ 100 link p = tail->pre; 101 delete(p); 102 return p; 103 } 104 } 105 106 107 void list_node(void) 108 { 109 printf("--pre-----------------\n"); 110 link node = tail->pre; 111 for(; node != head; node=node->pre){ 112 printf("num=%d, node->day=%s\n", node->num, node->day); 113 } 114 printf("-next------------------\n"); 115 for(node=head->next; node!=tail; node=node->next){ 116 printf("num=%d,date=%s, node->day=%s\n", node->num, node->date, node->day); 117 } 118 } 119 120 void re_write(FILE *fp) 121 { 122 link node = tail->pre; 123 char *str = malloc(sizeof(char));//malloc(NULL); 124 for(; node != head; node=node->pre){ 125 printf("re_write num=%d, date=%s, day=%s\n", node->num, node->date, node->day); 126 127 sprintf(str, "%d %s %s\n", node->num, node->date, node->day); 128 fputs(str, fp); 129 } 130 }