双向链表操作日志文件

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 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值