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;
}
Работа с двусвязными списками в C
Есть 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]
Второй файл(вроде бы функции и определения к требуемой программе)
Код:
Итак… Вот она та самая злосчастная программа. Есть некоторые аспекты, которые меня в ней не устраивают:
1.Это плод творения не моих рук. И хоть наш преподаватель не отличается зверским интеллектом, я думаю, что он все-таки сообразит, что писал ее не я.
2. Она слишком сложна для моего коэффициента интеллекта.
И поэтому у меня к вам господа хорошие просьбочка: упростить эту программу до минимума, но чтобы в ней осталась возможность редактировать данные. Все лишнее – графический интерфейс и прочую лабуду было бы неплохо убрать, было бы здорово, чтобы эти 2 файла преобразились в один. Оставить только, как я уже упоминал выше, возможность редактирования.
хех, интересное задание....