`
langzhe
  • 浏览: 278559 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

双向链表操作日志文件

    博客分类:
  • c
 
阅读更多

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 }

 

0
0
分享到:
评论

相关推荐

    C#程序开发范例宝典(第2版).part13

    实例108 使用FileSystemWatcher组件监视系统日志文件是否被更改 157 3.5 HelpProvider组件 158 实例109 使用HelpProvider组件调用帮助文件 159 3.6 Process组件 159 实例110 使用Process组件访问本地进程 159 ...

    C#程序开发范例宝典(第2版).part08

    实例108 使用FileSystemWatcher组件监视系统日志文件是否被更改 157 3.5 HelpProvider组件 158 实例109 使用HelpProvider组件调用帮助文件 159 3.6 Process组件 159 实例110 使用Process组件访问本地进程 159 ...

    C#程序开发范例宝典(第2版).part02

    实例108 使用FileSystemWatcher组件监视系统日志文件是否被更改 157 3.5 HelpProvider组件 158 实例109 使用HelpProvider组件调用帮助文件 159 3.6 Process组件 159 实例110 使用Process组件访问本地进程 159 ...

    C#程序开发范例宝典(第2版).part12

    实例108 使用FileSystemWatcher组件监视系统日志文件是否被更改 157 3.5 HelpProvider组件 158 实例109 使用HelpProvider组件调用帮助文件 159 3.6 Process组件 159 实例110 使用Process组件访问本地进程 159 ...

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    实例132 双向链表的实现 168 实例133 堆栈的实现 173 实例134 队列的实现 175 实例135 树的实现 177 6.2 常见算法的实际应用 180 实例136 计算1+22+33+44+…+nn的值 180 实例137 计算10!的值 181 实例138 求最大公...

    Delphi开发范例宝典目录

    5.6 指定类型的文件操作 239 实例187 对INI文件进行操作 239 实例188 文本文件的操作 241 实例189 在程序中使用自定义文件格式 242 实例190 简单的文件加密解密 244 5.7 其他 246 实例191 在DELPHI中...

Global site tag (gtag.js) - Google Analytics