Добавил:
okley
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:3 семестр / sr20
.c#include <stdio.h>
#include <stdlib.h>
typedef struct el{ // element lista
int inf;
struct el *next;
struct el *prev;
} EL;
EL *found=NULL;
typedef struct q{ // nach. i kon. ukazateli lista
EL *beg;
EL *end;
} Q;
void push_end(Q *q, int val) { // dob. v konets
EL *p;
p = (EL*) malloc(sizeof(EL));
p->inf = val;
p->prev = NULL;
p->next = NULL;
if (q->end == NULL) {
q->beg = p;
q->end = p;
}
else {
p->prev=q->end;
q->end->next = p;
q->end = p;
}
}
void push_start(Q *q, int val) { // dob. v nachalo
EL *p;
p = (EL*) malloc(sizeof(EL));
p->inf = val;
p->next = NULL;
p->prev = NULL;
if (q->end == NULL) {
q->beg = p;
q->end = p;
}
else {
p->next=q->beg;
q->beg->prev=p;
q->beg = p;
}
}
void pop_start(Q *q) { // udal. s nachala
if (q->beg == NULL) { // popitka udaleniya iz pustogo lista
exit(1);
}
else if((q->beg)==(q->end)){
q->beg=NULL;
q->end=NULL;
}
else {
q->beg=q->beg->next;
q->beg->prev=NULL;
}
}
void pop_end(Q *q) { // udalenie s kontsa
if (q->beg == NULL) { // popitka udaleniya iz pustogo lista
exit(1);
}
else if((q->beg)==(q->end)){
q->beg=NULL;
q->end=NULL;
}
else{
q->end=q->end->prev;
q->end->next=NULL;
}
}
void output(Q *q){
EL *p;
if((q->beg)!=NULL){
p=q->beg;
while((p->next)!=NULL){
printf("%4d", p->inf);
p=p->next;
}
printf("%4d\n", p->inf);
}
}
void inv_output(Q *q){ // vivod s kontsa
EL *p;
if((q->end)!=NULL){
p=q->end;
while((p->prev)!=NULL){
printf("%4d", p->inf);
p=p->prev;
}
printf("%4d\n", p->inf);
}
}
int summ(Q *q){ // summa
int s=0;
EL *p;
if((q->beg)!=NULL){
p=q->beg;
while((p->next)!=NULL){
s+=p->inf;
p=p->next;
}
s+=p->inf;
}
return(s);
}
void rand_push(Q *q, int a, int b, int n, int c){ // dobavit. sluchaynoe chislo v start (c=0) ili end (c!=0) n raz
int i, r; // rand()%x = {0.. (x-1)}, rand()%(b-a+1) = {0.. b-a}, rand()%(b-a+1) + a = {a.. b} - to, chto nam nado;
if(c){
for(i=0; i<n; i++){
r=rand()%(b-a+1)+a;
push_end(q, r);
}
}
else{
for(i=0; i<n; i++){
r=rand()%(b-a+1)+a;
push_start(q, r);
}
}
}
void del(Q *q){ // udalenie vsego lista
if (q->beg == NULL) { // popitka udaleniya iz pustogo lista
exit(1);
}
while((q->beg)!=(q->end)){
pop_end(q);
}
pop_end(q);
}
void find(Q *q, int val){ // poisk
EL *p;
if((q->beg)!=NULL){
p=q->beg;
while(((p->next)!=NULL)&&(found==NULL)){ // probezhka po listu
if((p->inf)==val){
found=p;
}
p=p->next;
}
if(((p->inf)==val)&&(found==NULL)){
found=p;
}
}
}
void push(Q *q, EL *pk, int val){ // dobavit pered elementom s ukazannim adresom
if(q->beg==NULL){ // pustoi list
exit(1);
}
EL *p;
p = (EL*) malloc(sizeof(EL));
p->inf = val;
p->next = pk;
p->prev = pk->prev;
pk->prev->next=p;
pk->prev=p;
}
void delEl(Q *q, EL *pk){ // udalenie elementa po adresu
if(q->beg==NULL){
exit(1);
}
else{
pk->next->prev=pk->prev;
pk->prev->next=pk->next;
}
}
int main(void){
Q *queue;
int a, b, v, s=0;
queue = (Q*) malloc(sizeof(Q));
queue->beg == NULL;
queue->end = NULL;
a=scanf("%d", &b); // boolean: esli chislo, daet true, elsi bukva (v tom chisle "n" - to false)
push_start(queue, b);
while(a){ // zapolnenie
a=scanf("%d", &b);
if(a) push_end(queue, b);
}
v=getchar();
scanf("%d", &v);
find(queue, v);
if(found!=NULL){
a=scanf("%d", &b); // analogichno zapolneniyu, no peredaet chisla v list dlya dobavleniya
push(queue, found, b);
while(a){
a=scanf("%d", &b);
if(a) push(queue, found, b);
}
output(queue);
delEl(queue, found); // udalyat element po adresu found
output(queue);
}
if(found==NULL) output(queue);
}
Соседние файлы в папке 3 семестр
