1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
#include <stdio.h> #include <stdlib.h> #include <time.h>
typedef struct Node { int data; struct Node *next, *pre; } Node;
typedef struct Dlist { Node head; int length; } Dlist;
Node *getNewNode(int val) { Node *p = (Node *)malloc(sizeof(Node)); p->data = val; p->next = p->pre = NULL; return p; }
Dlist *init_list() { Dlist *l = (Dlist *)malloc(sizeof(Dlist)); l->head.next = NULL; l->length = 0; return l; }
int insert(Dlist *l, int ind, int val) { if(l == NULL) return 0; if(ind < 0 || ind > l->length) return 0; Node *p = &(l->head), *node = getNewNode(val); while(ind--) p = p->next; node->next = p->next; p->next = node; node->pre = p; if(node->next != NULL) node->next->pre = node; l->length ++; return 1; }
void clear_node(Node *node) { if(node == NULL) return ; free(node); return ; }
void clear(Dlist *l) { if(l == NULL) return ; Node *p = l->head.next, *t; while(p) { t = p->next; clear_node(p); p = t; } free(l); return ; }
int erase(Dlist *l, int ind) { if(l == NULL ) return 0; if(ind < 0 || ind >= l->length) return 0; Node *p= &(l->head), *t; while(ind--) p = p->next; t = p->next; p->next = t->next; if(t->next != NULL) t->next->pre = p; clear_node(t); l->length--; return 1; }
void l_output(Dlist *l) { if(l == NULL) return ; printf("L-Dlist(%d) : ", l->length); for(Node *p = l->head.next; p; p = p->next) { printf("%d->", p->data); } printf("NULL\n"); return ; }
void r_output(Dlist *l) { if(l == NULL) return ; printf("L-Dlist(%d) : ", l->length); int ind = 0; Node *p = &(l->head); while(ind++ != l->length) p = p->next; for(; p != &(l->head); p = p->pre) { printf("%d->", p->data); } printf("head\n"); return ; }
int main() { #define MAX_OP 20 Dlist *l = init_list(); for(int i = 0; i < MAX_OP; i++) { int val = rand() % 100; int ind = rand() % (l->length + 3) - 1; int op = rand() % 2; switch(op) { case 0 : { printf("erase a iterm at %d form lis = %d", ind, erase(l, ind)); } break; case 1 : { printf("insert %d at %d to Lis = %d\n", val, ind, insert(l, ind, val)); } break; } l_output(l); r_output(l), printf("\n"); } #undef MAX_OP clear(l); return 0; }
|