Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с двусвязными списками в C

30K
11 января 2008 года
Fallen Soul
8 / / 11.01.2008
Лабораторная работа в языке С

Есть 2 файла с кодом к этой программе:
файл номер 1(вроде бы это графический интерфейс)

[сode]
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <io.h>
#include <fcntl.h>
#include <sys\stat.h>
#define DEFAULT_DB "c:\\students.txt"
#define xchg(a,b) int xtmp=a;a=b;b=xtmp;
#define LINES_COUNT 19
#include "beam3s.cpp"

void printwindow(int field, STUDENT * s) {
gotoxy(25,8+field);
switch(field) {
case 0: cprintf("%-10d", s->key); break;
case 1: cprintf("%-40s", s->f); break;
case 2: cprintf("%-20s", s->i); break;
case 3: cprintf("%-20s", s->o); break;
}
}

void printkeys(int i) {
textattr((3<<4)+0);
switch (i) {
case 1:
gotoxy(1,LINES_COUNT+5);
cprintf(" F1 і F2 і F4 і Esc і%46s","");
gotoxy(1,LINES_COUNT+6);
cprintf("Џ®¬®ймі‘®еа *Ёвмі€§¬Ґ*Ёвмі‚л室і%46s","");
break;
case 2:
gotoxy(1,LINES_COUNT+5);
cprintf(" F1 і Enter і Esc і%52s","");
gotoxy(1,LINES_COUNT+6);
cprintf("Џ®¬®ймі‘®еа *Ёв쳎⬥*Ёвмі%52s","");
break;
case 3:
gotoxy(1,LINES_COUNT+5);
cprintf("і Enter і Esc і%52s","");
gotoxy(1,LINES_COUNT+6);
cprintf("і‘®еа *ЁвміЌҐ б®еа *пвмі%52s","");
}
}

int ynquestion(char * caption, char * title)
{
return 1;
/* int y;
printkeys(2);
gotoxy(10,5); textattr(15+(7<<4));
cprintf("ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД·");
for (y=6; y<14; y++) { gotoxy(10,y); cprintf("і%60s",""); }
textcolor(0);
for (y=6; y<14; y++) { gotoxy(70,y); cprintf("є"); }
gotoxy(10,14);
cprintf("ФНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННј");
gotoxy(11,6); textattr(15+(1<<4));
cprintf(" €§¬Ґ*Ґ*ЁҐ *ЄҐв*ле ¤ **ле бв㤥*в ");
textattr(0+(7<<4));
return 0;*/
}

int editwindow(STUDENT * s) {
int y,i,j;
printkeys(2);
gotoxy(10,5); textattr(15+(7<<4));
cprintf("ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД·");
for (y=6; y<14; y++) { gotoxy(10,y); cprintf("і%60s",""); }
textcolor(0);
for (y=6; y<14; y++) { gotoxy(70,y); cprintf("є"); }
gotoxy(10,14);
cprintf("ФНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННј");
gotoxy(11,6); textattr(15+(1<<4));
cprintf(" €§¬Ґ*Ґ*ЁҐ *ЄҐв*ле ¤ **ле бв㤥*в ");
textattr(0+(7<<4));
gotoxy(11,8); cprintf(" # § зҐвЄЁ "); printwindow(0, s);
gotoxy(11,9); cprintf(" ” ¬Ё«Ёп "); printwindow(1, s);
gotoxy(11,10); cprintf(" €¬п "); printwindow(2, s);
gotoxy(11,11); cprintf(" ЋвзҐвбвў® "); printwindow(3, s);
int field = 0, pos = 0, posmax = 0, maxlen = 0;
int c; char * a;
textattr(7+(4<<4));
while(1) {
switch(field) {
case 0: a = NULL; break;
case 1: a = s->f; maxlen = 40; break;
case 2: a = s->i; maxlen = 20; break;
case 3: a = s->o; maxlen = 20;
}
printwindow(field,s);
gotoxy(25+pos, 8+field);
c = getch();
switch(c)
{
case 0:
c = getch();
switch(c) {
case 72: // up
case 80: // down
textattr(0+(7<<4)); printwindow(field,s);
if (c == 72)
if (field==0) field=3; else field--;
else
if (field==3) field = 0; else field++;
textattr(7+(4<<4));
switch(field) {
case 0: posmax = 0; break;
case 1: posmax = strlen(s->f); break;
case 2: posmax = strlen(s->i); break;
case 3: posmax = strlen(s->o); break;
}
pos = posmax;
break;
case 75: if (pos>0) pos--; break;//left
case 77: if (pos<posmax) pos++; break;//right
case 83: // delete
if (pos < posmax) {
if (!a) break;
j = posmax-1;
for(i=pos;i<j;i++)
a = a[i+1];
a = 0;
posmax--;
}
}
break;
case 8: // backspace
if (pos > 0) {
if (!a) break;
j = posmax-1;
for(i=pos-1;i<j;i++)
a = a[i+1];
a = 0;
pos--; posmax--;
}
break;
case 13: // enter
return 1;
case 27: // escape
return 0;
default:
if(a[pos]==0) {
if (posmax==maxlen) break;
a[pos+1]=0;
posmax++;
}
a[pos] = c;
pos++;
}
}
}

void mainwindow() {
int changed = 0;
int numtop=0;
int num = 0, i;
STUDENT * active;
STUDENT activecopy;
textattr((7<<4)+0); clrscr();
// ‚лў®¤ § Ј®«®ўЄ ®Є*
textattr((1<<4)+15); cprintf("%25s%-55s","","Ѓ § ¤ **ле бв㤥*в®ў „ѓ’“");
// ‚лў®¤ § Ј®«®ўЄ в Ў«Ёжл
textattr((7<<4)+0);
cprintf("#Ї/Їі# § зҐвЄЁі” ¬Ё«Ёп і€¬п іЋвзҐбвў® \n\r");
cprintf("ДДДДЕДДДДДДДДДЕДДДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДДДДД\n\r");
// ‚лў®¤ ®ЇЁб *Ёп Є« ўЁи
printkeys(1);
while(1) {
gotoxy(1,4);
active = NULL;
tek=top; for (i=0; i<numtop; i++) tek=tek->next;
for (i=0; i<LINES_COUNT; i++) {
textattr((7<<4)+0);
if (num==i+numtop) { textattr((4<<4)+7); active = tek; }
cprintf("%4dі%9ldі%12sі%10sі%15s\n\r",i+numtop+1,tek->key,tek->f,tek->i,tek->o);
tek = tek->next;
if (!tek) break;
}
printf("ННННПНННННННННПННННННННННННПННННННННННПННННННННННННННН");
switch(getch())
{
case 0:
switch(getch()) {
case 59: // F1
break;
case 60: // F2
s_savefile(DEFAULT_DB);
changed = 0;
break;
case 62: // F4
memcpy(&activecopy, active, sizeof(activecopy));
changed = editwindow(&activecopy);
if (changed)
memcpy(active, &activecopy, sizeof(activecopy));
printkeys(1);
break;
case 72:
if(num > 0) {
num--;
if (numtop > num) numtop--;
} else {
num = 0; tek=top;
while(tek->next) {
tek=tek->next;
num++;
}
numtop = num-LINES_COUNT+1;
if(numtop<0) numtop = 0;
}
break;
case 75: break;//left
case 77: break;//right
case 80:
if(active->next) {
num++;
if (numtop+LINES_COUNT <= num) numtop++;
} else {
num = 0;
numtop = 0;
}
}
break;
case 27: // Escape
if (ynquestion("„ **лҐ Ўл«Ё Ё§¬Ґ*Ґ*л. ‘®еа *Ёвм Ё§¬Ґ*Ґ*Ёп?", "‚л室 Ё§ Їа®Ја ¬¬л"))
s_savefile(DEFAULT_DB);
return;
}
}
}

void main(void) {
s_loadfile(DEFAULT_DB);
s_sort();
mainwindow();
textattr((0<<4)+7);
clrscr();
s_clear();
}
[/code]

Второй файл(вроде бы функции и определения к требуемой программе)
Код:
typedef unsigned char MARK;
typedef struct STUDENT {
  long key;                // Nomer zachetki
  char f[50],i[20],o[20];  // FIO
  MARK marks[10];          // Ocenki
  STUDENT *prev,*next;     // Ukazateli
};
#define NEW_STUDENT (STUDENT *)malloc(sizeof(STUDENT))
STUDENT *top=NULL,*tek=NULL;
int s_count(void) {
  int res = 0;
  tek = top;
  while(tek) {
    res++; tek = tek->next;
  }
  return res;
}
void s_find(long key) {
  tek = top;
  while(tek) {
    if(tek->key==key) return;
    tek=tek->next;
  }
}
void s_gotoend(void) {
  tek=top;
  if(tek)
    while(tek->next)
      tek=tek->next;
}
STUDENT * s_addafter(void) {
  STUDENT *snew;
  snew = NEW_STUDENT;
  if(!top)
    top=snew;
  else
    if(!tek) s_gotoend();
  snew->prev = tek;
  if(!tek)
    snew->next = NULL;
  else {
    snew->next = tek->next;
    tek->next = snew;
    if(snew->next) snew->next->prev=snew;
  }
  return snew;
}
STUDENT * s_addbefore(void) {
  STUDENT *snew;
  snew = NEW_STUDENT;
  if(!top)
    top=snew;
  else
    if(!tek)tek=top;
  snew->next = tek;
  if(!tek) {
    snew->prev = NULL;
    top = snew;
  } else {
    snew->prev = tek->prev;
    tek->prev = snew;
    if(snew->prev)
      snew->prev->next = snew;
    else
      top = snew;
  }
  return snew;
}
void s_delete(void) {
  STUDENT * next;
  if(!tek) return;
  if(tek->prev) tek->prev->next = tek->next;
  if(tek->next) tek->next->prev = tek->prev;
  next=tek->next;
  free(tek);
  tek=next;
}
void s_clear(void) {
  tek = top;
  top = NULL;
  while(tek)
    if (tek->next) {
      tek = tek->next;
      free(tek->prev);
    } else {
      free(tek);
      tek = NULL;
    }
}

void s_loadfile(const char * path) {
  FILE * db = fopen(path,"rt");
  if (!db) {
    fprintf(stderr, "ЋиЁЎЄ  ®вЄалвЁп д ©«  б® бЇЁбЄ®¬ бв㤥*в®ў.");
    return;
  }
  s_gotoend();
  while(!feof(db)) {
    tek = s_addafter();
    fscanf(db, "%ld\t%s\t%s\t%s\t\n",
       &tek->key, tek->f, tek->i,tek->o);
  }
  fclose(db);
}

void s_savefile(const char * path) {
  FILE * db;
  db = fopen(path,"wt");
  tek = top;
  while(tek) {
    fprintf(db,"%ld\t%s\t%s\t%s\t\n",
        tek->key,tek->f,tek->i,tek->o);
    tek = tek->next;
  }
  fclose(db);
}

STUDENT * s_insert(STUDENT * a, STUDENT * l) {
  a->next = NULL;
  if (!l) return a;
  else {
    int i = strcmp(a->f, l->f);
    if (i == 0) {
      i = strcmp(a->i, l->i);
      if (i == 0) i = strcmp(a->o, l->o);
    }
    if (i <= 0) {
      a->next = l;
      return a;
    } else {
      l->next = s_insert(a, l->next);
      return l;
    }
  }
}

STUDENT * s_insertSort(STUDENT * l) {
  return !l ? NULL : s_insert(l, s_insertSort(l->next));
}

void s_sort() {
  STUDENT * res;
  top = s_insertSort(top);
  tek = top;
  STUDENT * prev = NULL;
  while (tek) {
    tek->prev = prev;
    prev = tek;
    tek = tek->next;
  }
}

STUDENT * s_fill(STUDENT * a, long key, char * f, char * i, char * o) {
  if (a) a->key = key; strcpy(a->f, f); strcpy(a->i, i); strcpy(a->o, o);
  return a;
}


Итак… Вот она та самая злосчастная программа. Есть некоторые аспекты, которые меня в ней не устраивают:
1.Это плод творения не моих рук. И хоть наш преподаватель не отличается зверским интеллектом, я думаю, что он все-таки сообразит, что писал ее не я.
2. Она слишком сложна для моего коэффициента интеллекта.
И поэтому у меня к вам господа хорошие просьбочка: упростить эту программу до минимума, но чтобы в ней осталась возможность редактировать данные. Все лишнее – графический интерфейс и прочую лабуду было бы неплохо убрать, было бы здорово, чтобы эти 2 файла преобразились в один. Оставить только, как я уже упоминал выше, возможность редактирования.
28K
11 января 2008 года
petrol1um
19 / / 31.12.2007
хех, интересное задание....
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог