Hatena::Groupbluespear

bluespearの勉強メモ

2006-12-18

[]学校の課題(プログラミング基礎) 双方向循環リストをソート 19:11

壊れた空調で暑い教室で使い慣れない環境で汚いソースを元に書いていって1時間バグに悩んだものを、自宅で一から書き直したら30分でできた。Emacsカスタマイズ方法調べとこう。

しかし自分のソースも綺麗とは言えない…

lsort.c

  • fclose()し忘れてたの修正
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct linecell LineCell;
struct linecell{
  LineCell *prev;
  LineCell *next;
  char *line;
};

LineCell *new_cell(char *str);
int read_data(LineCell *root);
void print_lines(LineCell *root);
void insert_cell(LineCell *add, LineCell *p);  /* insert after p */
void rm_cell(LineCell *rm);                    /* remove rm */
void sort(LineCell *root);


LineCell *new_cell(char *str){
  LineCell *p;

  if(!(p = (LineCell *)malloc(sizeof(LineCell)))){
    fprintf(stderr, "malloc failed in new_cell()\n");
    exit(-1);
  }
  p->prev = p->next = NULL;
  if(!(p->line = (char *)malloc(sizeof(char)*(strlen(str)+1)))){
    fprintf(stderr, "malloc failed in new_cell()\n");
    exit(-1);
  }
  strcpy(p->line, str);
  return p;
}

int read_data(LineCell *root){
  char buf[1024];
  int i, n;
  FILE *fp;

  if(!(fp = fopen("lsort_data", "r"))){
    fprintf(stderr, "Can't open file.\n");
    exit(-1);
  }
  fscanf(fp, "%d", &n);
  for(i = 0; i < n; i++){
    fscanf(fp, "%s", buf);
    insert_cell(new_cell(buf), root->prev);
  }
  fclose(fp);
  return i;
}
  
void print_lines(LineCell *root){
  LineCell *p;
  for(p = root->next; p != root; p = p->next){
    printf("%s\n", p->line);
  }
}


void insert_cell(LineCell *add, LineCell *p){
  add->next = p->next;
  add->prev = p;
  add->next->prev = add;
  add->prev->next = add;
}


void rm_cell(LineCell *rm){
  rm->next->prev = rm->prev;
  rm->prev->next = rm->next;
}


void sort(LineCell *root){
  LineCell *tail = root;
  LineCell *max, *p;
  while(tail->prev != root->next){
    for(max = root->next, p = root->next->next; p != tail; p = p->next){
      if(strcmp(p->line, max->line) > 0)
        max = p;
    }
    rm_cell(max);
    insert_cell(max, tail->prev);
    tail = max;
  }
}

/* main func */
void main(){
  int num;
  LineCell rootcell = {&rootcell, &rootcell, "---root cell---"};
  LineCell *root = &rootcell;
  
  num = read_data(root);
  printf("===original data===\n");
  print_lines(root);
  sort(root);
  printf("=== sorted data ===\n");
  print_lines(root);
}

lsort_data

課題で渡されたlsort_dataは持ってないので適当に作った

10
and processing image textures
meshes shape
motion capture surface
modeling