
Struct+List ++
.pdf
Sort Bubble List 1
int BubleList(LIST *head, LIST *&ph) { int a, b, h, count=0, exch;
LIST *p,*q,*r,*t,*pend,*pmem; pend=0; ph=phead; while(pend!=ph) // r p q t -> r q p t
{ exch=0; pmem=ph; while(1) // q!=pend
{ p=pmem; q=p->next; pmem=q; if(q==pend)
{ pend=p; break; }
31

Sort Bubble List 2
a=p->x; b=q->x; if(p->x > q->x)
{r=p->prev; if(r!=0) r->next=q; t=q->next; if(t!=0) t->prev=p;
q->prev=r; q->next=p;
p->prev=q; p->next=t; // h=q->x; q->x=p->x; p->x=q->x; pmem=p;
if(p->prev==0) ph=p;
if(q->prev==0) ph=q; exch++; count++;
}
a=p->x; b=q->x; } // while 2 if(exch==0) break;
} // while 1
return count; // cmp } // BubleList
32

List Sort - method Insertion 1
int SortInsertList(LIST *head, LIST *&psort)
{int a, b, h, count=0, exch;
LIST *p, *q, *r, *t, *pend, *pmem; pend=0; ph=head; while(pend!=ph)
{ exch=0; pmem=ph;
|
while(1) |
// q!=pend |
|
{ |
p=pmem; q=p->next; pmem=q; |
|
|
|
if(q==pend) { pend=p; break; } |
|
|
|
a=p->x; b=q->x; |
|
|
|
if(p->x > q->x) |
|
|
{ |
r=p->prev; |
if(r!=0) r->next=q; |
|
|
t=q->next; |
if(t!=0) t->prev=p; |
|
|
q->prev=r; q->next=p; p->prev=q; p->next=t; |
33 |

List Sort - Insertion 2
pmem=p; if(p->prev==0) ph=p; if(q->prev==0) ph=q; exch++; count++;
}
a=p->x; b=q->x; } // while 2
if(exch==0) break; } // while 1
return count;
} // SortInsertList
34

Алфавитно-частотный словарь
Алгоритм:
открыть файл на чтение;
FILE *file = fopen ( “book.dat", "r" );
char word[80];
n = fscanf ( file, "%s", word );
если файл закончился (feof(file)), то выйти из цикла; если слово найдено, увеличить счётчик (поле count); если слова нет в списке, то
создать новый узел (CreateNode) и заполнить поля найти узел, перед которым нужно вставить слово
(SearchItem);
добавить узел (InsertItem);
Вывести список слов, используя проход по списку.
35

Задача Иосифа Флавия
n=10 m=2
Убивают |
2 |
4 |
6 |
8 |
10 |
3 |
7 |
1 |
9 |
Остаётся |
5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36

Задача Иосифа Флавия
struct IOSIF { int x; IOSIF *next, *prev; };
|
IOSIF *CreateIosifList(IOSIF *&head, int n) |
|
{ int i; IOSIF *p,*q; |
|
|
|
for(i=0; i<n; i++) |
|
{ |
p=(IOSIF *)malloc(sizeof(IOSIF)); |
|
|
p->x=i+1; |
|
|
if(i==0) { head=p; p->next=p; p->prev=p; } |
|
|
else { q->next=p; p->prev=q; } |
|
|
q=p; |
|
} |
// for i |
|
|
p->next=head; head->prev=p; |
|
|
return head; |
|
} |
// CreateIosifList |
37 |
|

Задача Иосифа Флавия
|
int DeleteIosifItem(IOSIF *¤t, int m) |
{ |
IOSIF *p=current; int i; |
|
for(i=1; i<m; i++) |
|
p=p->next; |
|
p->prev->next=p->next; |
|
p->next->prev=p->prev; |
|
i=p->x; |
|
current=p->next; |
|
free(p); |
|
return i; |
} |
|
38

Задача Иосифа Флавия
int Iosif(int n, int m) { int i, j, k; IOSIF *p;
CreateIosifList(p,n); i=0; k=n; while(k>1)
{ i++; if(i==m)
{ j=DeleteIosifItem(p,m); i=0; k--;
}
} // while return p->x;
} // Iosif
39

Задача Иосифа Флавия
printf(" n\\m"); for(m=1; m<=15; m++) printf("%3i ",m); printf("\n\n"); for(n=1; n<=10; n++)
{ printf(" %3i",n); for(m=1; m<=15; m++) { k=Iosif(n, m); printf("%3i ", k);
}
printf("\n");
}
40