data structure in c ─ 樹狀結構

Download Data Structure in C                            ─  樹狀結構

If you can't read please download the document

Upload: marva

Post on 08-Jan-2016

81 views

Category:

Documents


7 download

DESCRIPTION

Data Structure in C ─ 樹狀結構. 大綱. 樹狀結構 ─ 專有名詞 樹狀結構 ─ 表示法 二元樹 二元搜尋樹 引線二元樹 堆積. 樹狀結構 ─專有名詞. 專有名詞 節點( node) 與邊( edge) 祖先( ancestor) 節點與子孫( descendant) 節點 父節點( parent node) 與子節點( children node) 兄弟節點( sibling node) 非終點節點( non-terminal node) - PowerPoint PPT Presentation

TRANSCRIPT

  • Data Structure in C

  • (node)(edge)(ancestor)(descendant)(parent node)(children node)(sibling node)(non-terminal node)(terminal node)(leaf node)(degree)(level)(path)

  • AKKAAB, C, DB, C, DAB, C, DJ, K, L, G, M, N, IA3B21

  • ()(Forest)n >= 0(disjoint trees)

  • (p. 3)Ex. p.3(A(B(E(J), F(K, L)), C(G), D(H(M, N), I))

    - () -(left child-right sibling)

  • ()(left most)(closest right)

  • ()2-45

  • (binary tree)(right subtree)(left subtree)()()()2 ()

  • ()(left skewed tree)(complete binary tree)(fully binary tree)

  • ()i2i-1i>=1()k2k-1k>=1n0n22n0=n2+1

  • ()

  • (parent)PARENTtypedef struct node *tree_pointer;typedef struct node { int data; tree_pointer left_child, right_child;};

  • ()(traversal)(inorder)(L)(V)(R)(preorder)(V) (L) (R)(postorder)(L) (R) (V)

  • A/B%C*D+E+*/A%BCDEABC%/D*E+void inorder(Node type *tree){ if (tree != NULL){ inorder(tree->llink); printf(%d, tree->data); inorder(tree->rlink);}void preorder(Node type *tree){ if (tree != NULL){ printf(%d, tree->data); preorder(tree->llink); preorder(tree->rlink);}void postorder(Node type *tree){ if (tree != NULL){ postorder(tree->llink); postorder(tree->rlink); printf(%d, tree->data);}

  • 45

  • (45)45

  • ()(priority)(associativity)

  • ()inorderpreorderinorderpostorderpreorderpostorderpp. 6-70~6-73

  • (binary search tree)(key value)(input sequence)

  • ()

    4890

  • /* */void access(char name[], int score){struct student *node, *prev;if(search(name) != NULL) /* */{printf("Student %s has existed!\n", name);return;}ptr = (struct student *) malloc(sizeof(struct student));strcpy(ptr->name, name);ptr->score = score;ptr->llink = ptr->rlink = NULL;

  • if(root == NULL) /* NULL */root = ptr;else /* NULL */{node = root;while(node != NULL) /* */{prev = node;if(strcmp(ptr->name, node->name) < 0)node = node->llink;elsenode = node->rlink;}if(strcmp(ptr->name, prev->name) < 0)prev->llink = ptr;elseprev->rlink = ptr;}}

  • /* target */struct student *search(char target[]){struct student *node;node = root;while(node != NULL){if(strcmp(target, node->name) == 0)return node;else/* target */if(strcmp(target, node->name) < 0)node = node->llink;else /* target */node = node->rlink;}return node;}

  • ()

  • ()

  • /* */void removing(char name[]){struct student *del_node;if((del_node = search(name)) == NULL) /* */{printf("Student %s not found!\n", name);return;}/* */if(del_node->llink != NULL || del_node->rlink != NULL)del_node = replace(del_node);else /* */if(del_node == root)root = NULL;elseconnect(del_node, 'n');free(del_node); /* */printf("Data of student %s deleted!\n", name);}

  • /* */struct student *replace(struct student *node){struct student *re_node;/* */if((re_node = search_re_r(node->rlink)) == NULL)re_node = search_re_l(node->llink);if(re_node->rlink != NULL) /* */connect(re_node, 'r');elseif(re_node->llink != NULL) /* */connect(re_node, 'l');else /* */connect(re_node, 'n');strcpy(node->name, re_node->name);node->score = re_node->score;return re_node;}

  • /* */struct student *search_re_r(struct student *node){struct student *re_node;re_node = node;while(re_node != NULL && re_node->llink != NULL)re_node = re_node->llink;return re_node;}

    /* */struct student *search_re_l(struct student *node){struct student *re_node;re_node = node;while(re_node != NULL && re_node->rlink != NULL)re_node = re_node->rlink;return re_node;}

  • /* linkrl mNULL */void connect(struct student *node, char link){struct student *parent;parent = search_p(node); /* *//* */if(strcmp(node->name, parent->name) < 0)if(link == 'r') /* linkr */parent->llink = node->rlink;elseif(link == 'l') /* linkl */parent->llink = node->llink;else /* linkm */parent->llink = NULL;

  • else /* */if(link == 'r') /* linkr */parent->rlink = node->rlink;elseif(link == 'l') /* linkl */parent->rlink = node->llink;else /* linkm */parent->rlink = NULL;}

  • /* node */struct student *search_p(struct student *node){struct student *parent;parent = root;while(parent != NULL){if(strcmp(node->name, parent->name) < 0)if(strcmp(node->name, parent->llink->name) == 0)return parent;elseparent = parent->llink;elseif(strcmp(node->name, parent->rlink->name) == 0)return parent;elseparent = parent->rlink;}return NULL;}

  • ()queuestack

  • (threaded binary tree)link fieldnull linklinklink(thread)

    1. LBIT=1LLINK2. LBIT=0LLINK3. RBIT=1RLINK4. RBIT=0RLINK

  • ()

  • ()stack

  • ()

  • void insert_right( struct tbintree *node_parent,struct tbintree *node){struct tbintree *w;node->rchild = node_parent->rchild;node->rbit = node_parent->rbit;node->lchild = node_parent;node->lbit = 0;node_parent->rchild = node;node_parent->rbit = 1;

    if ( node->rbit == 1 ) /*nodetree*/{w = insucc( node );w->lchild = node;}}

  • void insert_left( struct tbintree *node_parent,struct tbintree *node){struct tbintree *w;node->lchild = node_parent->lchild;node->lbit = node_parent->lbit;node->rchild = node_parent;node->rbit = 0;node_parent->lchild = node;node_parent->lbit = 1;

    if ( node->lbit == 1 ) /*node tree*/{w = inpred( node );w->rchild = node;}}

  • if ( ptr->lbit == 0 && ptr->rbit == 0 ){if ( ptr_parent == root ) /**/{ptr_parent->lchild = root;ptr_parent->lbit = 0;} /**/else if ( ptr->number < ptr_parent->number ){ptr_parent->lchild = ptr->lchild;ptr_parent->lbit = 0;}else /**/{ptr_parent->rchild = ptr->rchild;ptr_parent->rbit = 0;}free(ptr);}

  • else if ( ptr->lbit == 1 && ptr->rbit == 1 ){/*ptr,*/ptr_pred = inpred ( ptr);

    ptr_pred->rchild = ptr->rchild;ptr_pred->rbit = ptr->rbit;ptr_parent->lchild = ptr->lchild;free(ptr);}else /**/{if ( ptr_parent == root ) /**/{if ( ptr->lbit == 1 ){ptr_pred = inpred(ptr);root->lchild = ptr->lchild;ptr_pred->rchild = root;}else{ptr_succ = insucc(ptr);root->lchild = ptr->rchild;ptr_succ->lchild = root;}}

  • else{if ( ptr->number < ptr_parent->number )ptr_parent->lchild = ptr->lchild;elseptr_parent->rchild = ptr->rchild;}}

  • (heap)()HeapHeap Sortheap sortHeapStack()Queue()

  • Heap

  • ()Heap

  • void insert_f(void){int id_temp;if(last_index >= MAX) /* */{printf("\n Login members are more than %d!!\n", MAX);printf(" Please wait for a minute!!\n");}else{printf("\n Please enter login ID number: ");scanf("%d", &id_temp);create(id_temp); /* */printf(" Login successfully!!\n");}}

    void create(int id_temp) /* ID_TEMP */{heap_tree[++last_index] = id_temp; /* */adjust_u(heap_tree, last_index); /* */}

  • void adjust_u(int temp[], int index) /* INDEXINDEX */{while(index > 1) /* */{if(temp[index]
  • ()Heap

  • void delete_f(void){int id_temp, del_index;if(last_index < 1) /* */{printf("\n No member to logout!!\n");printf(" Please check again!!\n");}else{printf("\n Please enter logout ID number: ");scanf("%d", &id_temp);del_index = search(id_temp); /* */if(del_index == 0) /* */printf(" ID number not found!!\n");else{removes(del_index); /* */printf(" ID number %d logout!!\n", id_temp);}}}

  • int search(int id_temp) /* ID_TEMP */{int c_index;for(c_index = 1; c_index 1) /* 1 */{/* PARENT NODE */if(heap_tree[index_temp] > heap_tree[index_temp / 2] && index_temp > 1)adjust_u(heap_tree, index_temp);else /* CHILDEN NODE */adjust_d(heap_tree, index_temp, last_index-1);}}

  • void adjust_d(int temp[], int index1, int index2){/* ID_TEMPINDEX_TEMPCHILDEN NODEINDEX */int id_temp, index_temp;id_temp = temp[index1];index_temp = index1 * 2;/* INDEXINDEX */while(index_temp = temp[index_temp]) /* */break;else{temp[index_temp/2] = temp[index_temp];index_temp *= 2;}}temp[index_temp/2] = id_temp;}

  • ()min-heapmax-heapmin-heap