Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- typedef char ELEMTYPE;
- typedef struct LinkedList {
- struct LinkedList* prev;
- struct LinkedList* next;
- ELEMTYPE elem;
- } Node;
- typedef struct MyList {
- Node* header;
- Node* trailer;
- int size;
- } MyList;
- Node* getNode()
- {
- Node* node = (Node*)malloc(sizeof(Node));
- node->prev = NULL;
- node->next = NULL;
- node->elem = 0;
- return node;
- }
- ELEMTYPE putNode(Node* node)
- {
- ELEMTYPE e = node->elem;
- free(node);
- return e;
- }
- void init(MyList* l)
- {
- l->header = getNode();
- l->trailer = getNode();
- l->header->next = l->trailer;
- l->trailer->prev = l->header;
- l->size = 0;
- }
- void get(MyList* l, int r)
- {
- Node* node = l->header;
- if (!(1 <= r && r <= l->size)) {
- printf("invalid position\n");
- return;
- }
- while (r--)
- node = node->next;
- printf("%c\n", node->elem);
- }
- void print(MyList* l)
- {
- Node* node = l->header->next;
- while (node != l->trailer) {
- printf("%c", node->elem);
- node = node->next;
- }
- printf("\n");
- }
- void add(MyList* l, int r, ELEMTYPE e)
- {
- Node* p = l->header, * newNode;
- if (!(1 <= r && r <= l->size + 1)) {
- printf("invalid position\n");
- return;
- }
- newNode = getNode();
- newNode->elem = e;
- while (--r)
- p = p->next;
- newNode->next = p->next;
- newNode->prev = p;
- p->next->prev = newNode;
- p->next = newNode;
- l->size++;
- }
- void delete(MyList* l, int r)
- {
- Node* delNode = l->header;
- if (!(1 <= r && r <= l->size)) {
- printf("invalid position\n");
- return;
- }
- while (r--)
- delNode = delNode->next;
- delNode->prev->next = delNode->next;
- delNode->next->prev = delNode->prev;
- l->size--;
- putNode(delNode);
- }
- void deleteAll(MyList* l)
- {
- while (l->size)
- delete(l, 1);
- putNode(l->header);
- putNode(l->trailer);
- free(l);
- }
- int main(void)
- {
- MyList* l = (MyList*)malloc(sizeof(MyList));
- int N;
- scanf("%d%*c", &N);
- init(l);
- while (N--)
- {
- char command, elem;
- int rank;
- scanf("%c", &command);
- switch (command)
- {
- case 'A':
- scanf("%d %c", &rank, &elem);
- add(l, rank, elem);
- break;
- case 'D':
- scanf("%d", &rank);
- delete(l, rank);
- break;
- case 'G':
- scanf("%d", &rank);
- get(l, rank);
- break;
- case 'P':
- print(l);
- break;
- default:
- break;
- }
- getchar();
- }
- deleteAll(l);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement