195 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			195 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include<stdio.h>
 | 
						|
#include<stdlib.h>
 | 
						|
typedef struct N {
 | 
						|
    int d;
 | 
						|
    struct N *p, *n;
 | 
						|
} N;
 | 
						|
 | 
						|
N *h;
 | 
						|
 | 
						|
void i(int d) {
 | 
						|
    N *n = malloc(sizeof(N));
 | 
						|
    n->d = d;
 | 
						|
    n->n = 0;
 | 
						|
    if (!h) {
 | 
						|
        n->p = 0;
 | 
						|
        h = n;
 | 
						|
        return;
 | 
						|
    }
 | 
						|
    N *t = h;
 | 
						|
    while (t->n) t = t->n;
 | 
						|
    t->n = n;
 | 
						|
    n->p = t;
 | 
						|
}
 | 
						|
 | 
						|
void delete_rear() {
 | 
						|
    if (!h) {
 | 
						|
        puts("Empty");
 | 
						|
        return;
 | 
						|
    }
 | 
						|
    if (!h->n) {
 | 
						|
        free(h);
 | 
						|
        h = 0;
 | 
						|
        return;
 | 
						|
    }
 | 
						|
    N *t = h;
 | 
						|
    while (t->n) t = t->n;
 | 
						|
    t->p->n = 0;
 | 
						|
    free(t);
 | 
						|
}
 | 
						|
 | 
						|
void ip(int d, int p) {
 | 
						|
    N *n = malloc(sizeof(N));
 | 
						|
    n->d = d;
 | 
						|
    if (p == 1) {
 | 
						|
        n->p = 0;
 | 
						|
        n->n = h;
 | 
						|
        if (h) h->p = n;
 | 
						|
        h = n;
 | 
						|
        return;
 | 
						|
    }
 | 
						|
    N *t = h;
 | 
						|
    for (int i = 1; i < p - 1 && t; i++) t = t->n;
 | 
						|
    if (!t) {
 | 
						|
        puts("Out of range");
 | 
						|
        return;
 | 
						|
    }
 | 
						|
    n->n = t->n;
 | 
						|
    n->p = t;
 | 
						|
    if (t->n) t->n->p = n;
 | 
						|
    t->n = n;
 | 
						|
}
 | 
						|
 | 
						|
void dp(int p) {
 | 
						|
    if (!h) {
 | 
						|
        puts("Empty");
 | 
						|
        return;
 | 
						|
    }
 | 
						|
    N *t = h;
 | 
						|
    if (p == 1) {
 | 
						|
        h = h->n;
 | 
						|
        if (h) h->p = 0;
 | 
						|
        free(t);
 | 
						|
        return;
 | 
						|
    }
 | 
						|
    for (int i = 1; i < p && t; i++) t = t->n;
 | 
						|
    if (!t) {
 | 
						|
        puts("Out of range");
 | 
						|
        return;
 | 
						|
    }
 | 
						|
    t->p->n = t->n;
 | 
						|
    if (t->n) t->n->p = t->p;
 | 
						|
    free(t);
 | 
						|
}
 | 
						|
 | 
						|
void ia(int d, int k) {
 | 
						|
    N *n = malloc(sizeof(N));
 | 
						|
    n->d = d;
 | 
						|
    N *t = h;
 | 
						|
    while (t && t->d != k) t = t->n;
 | 
						|
    if (!t) {
 | 
						|
        puts("Not found");
 | 
						|
        return;
 | 
						|
    }
 | 
						|
    n->n = t->n;
 | 
						|
    n->p = t;
 | 
						|
    if (t->n) t->n->p = n;
 | 
						|
    t->n = n;
 | 
						|
}
 | 
						|
 | 
						|
void ib(int d, int k) {
 | 
						|
    N *n = malloc(sizeof(N));
 | 
						|
    n->d = d;
 | 
						|
    if (!h) {
 | 
						|
        puts("Empty");
 | 
						|
        return;
 | 
						|
    }
 | 
						|
    if (h->d == k) {
 | 
						|
        n->n = h;
 | 
						|
        n->p = 0;
 | 
						|
        h->p = n;
 | 
						|
        h = n;
 | 
						|
        return;
 | 
						|
    }
 | 
						|
    N *t = h;
 | 
						|
    while (t->n && t->n->d != k) t = t->n;
 | 
						|
    if (!t->n) {
 | 
						|
        puts("Not found");
 | 
						|
        return;
 | 
						|
    }
 | 
						|
    n->n = t->n;
 | 
						|
    n->p = t;
 | 
						|
    t->n->p = n;
 | 
						|
    t->n = n;
 | 
						|
}
 | 
						|
 | 
						|
void t() {
 | 
						|
    for (N *t = h; t; t = t->n) printf("%d ", t->d);
 | 
						|
    puts("");
 | 
						|
}
 | 
						|
 | 
						|
void r() {
 | 
						|
    N *t = 0, *c = h;
 | 
						|
    while (c) {
 | 
						|
        t = c->p;
 | 
						|
        c->p = c->n;
 | 
						|
        c->n = t;
 | 
						|
        c = c->p;
 | 
						|
    }
 | 
						|
    if (t) h = t->p;
 | 
						|
}
 | 
						|
 | 
						|
int main() {
 | 
						|
    int c, d, p, k;
 | 
						|
    while (1) {
 | 
						|
        puts("\n1.Insert rear\n2.Delete rear\n3.Insert position\n4.Delete position\n5.Insert after\n6.Insert before\n7.Traverse\n8.Reverse\n9.Exit");
 | 
						|
        printf("Choice: ");
 | 
						|
        scanf("%d", &c);
 | 
						|
        switch (c) {
 | 
						|
            case 1:
 | 
						|
                printf("Data: ");
 | 
						|
                scanf("%d", &d);
 | 
						|
                i(d);
 | 
						|
                break;
 | 
						|
            case 2:
 | 
						|
                delete_rear();
 | 
						|
                break;
 | 
						|
            case 3:
 | 
						|
                printf("Data: ");
 | 
						|
                scanf("%d", &d);
 | 
						|
                printf("Position: ");
 | 
						|
                scanf("%d", &p);
 | 
						|
                ip(d, p);
 | 
						|
                break;
 | 
						|
            case 4:
 | 
						|
                printf("Position: ");
 | 
						|
                scanf("%d", &p);
 | 
						|
                dp(p);
 | 
						|
                break;
 | 
						|
            case 5:
 | 
						|
                printf("Data: ");
 | 
						|
                scanf("%d", &d);
 | 
						|
                printf("After: ");
 | 
						|
                scanf("%d", &k);
 | 
						|
                ia(d, k);
 | 
						|
                break;
 | 
						|
            case 6:
 | 
						|
                printf("Data: ");
 | 
						|
                scanf("%d", &d);
 | 
						|
                printf("Before: ");
 | 
						|
                scanf("%d", &k);
 | 
						|
                ib(d, k);
 | 
						|
                break;
 | 
						|
            case 7:
 | 
						|
                t();
 | 
						|
                break;
 | 
						|
            case 8:
 | 
						|
                r();
 | 
						|
                break;
 | 
						|
            case 9:
 | 
						|
                exit(0);
 | 
						|
            default:
 | 
						|
                puts("Invalid");
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |