标签:
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
逻辑结构包括:
1.集合
数据结构中的元素之间除了“同属一个集合” 的相互关系外,别无其他关系;
2.线性结构
数据结构中的元素存在一对一的相互关系;
3.树形结构
数据结构中的元素存在一对多的相互关系;
4.图形结构
数据结构中的元素存在多对多的相互关系。
================
效果:1、对于,数据结构、堆栈的简单总结。2、链表的操作!
> 自引用结构
struct list {
int data;
struct list *next;
} a;
> 线性链表
list.h:
#include <stdio.h>
#include <stdlib.h>
typedef char DATA; /* will use char in examples. */
struct linked_list {
DATA d;
struct linked_list *next;
};
typedef struct linked_list ELEMENT;
typedef ELEMENT *LINK;
> 链表操作
#include "list.h"
#include <stdlib.h>
LINK string_to_list(char s[])
{
LINK head;
if (s[0] == ‘\0‘) /* base case. */
return NULL;
else {
head = malloc(sizeof(ELEMENT));
head -> d = s[0];
head -> next = string_to_list(s+1);
return head;
}
}
* 插入(insert)
/* Inserting an element in a linked list. */
void insert(LINK p1, LINK p2, LINK q)
{
assert(p1 -> next == p2);
p1 -> next = q; /* insert */
q -> next = p2;
}
* 删除(delete)
/* Recursive deletion of a list. */
void delete_list(LINK head)
{
if (head != NULL) {
delete_list(head -> next);
free(head); /* release storage */
}
}
> 堆栈
堆栈(压入、弹出)
堆栈、是暂时存放数据和地址,通常用来保护断点和现场;
堆,队列优先,先进先出(First-In/First-Out);
栈,先进后出(First-In/Last-Out)。
ADT Stack(堆栈)
1、只能在一端(称为栈顶(top))对数据项进行插入和删除
2、push(压入==增)、pop(弹出==删)、top(取顶部元素==查)、empty(判断是否为空)、full(判断是否已满)和reset(重置==init)
================
|--> Copyright (c) 2015 Bing Ma.
|--> GitHub RUL: https://github.com/SpongeBob-GitHub
================
二叉树
树(tree)是一种称为节点(node)的元素的有限集合。
树具有一个唯一节点(根节点),每个节点最多具有2个子节点(左孩子、右孩子)。
叶节点、它的左右孩子节点为NULL
遍历(Traversal)
是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问!
树的遍历:1、沿链表移动;2、根据下标访问,指向链表的数组元素。
[ 通过根节点访问时间决定 ]
中序(inorder):先访问左子树,再访问根节点
左->根->右(必须递归遍历完后,再进行下一步)
前序(preorder):先访问根节点
根->左->右
后序(postorder):访问完左右子树后,才访问根节点
左->右->根
Binary Tree
/* Inorder binary tree traversal. */
void inorder (BTREE root)
{
if (root != NULL) {
inorder(root -> left); /* recur left */
printf("%c", root -> d);
inorder(root -> right); /* recur right */
}
}
/* Output: A B C D E F G H I J */
前序和后序函数:
/* Preorder and postorder binary tree traversal. */
// preorder
void preorder (BTREE root)
{
if (root != NULL) {
printf("%c", root -> d);
preorder(root -> left); /* recur left */
preorder(root -> right); /* recur right */
}
}
/* Output: G D B A C F E I H J */
// preorder
void postorder (BTREE root)
{
if (root != NULL) {
postorder(root -> left); /* recur left */
postorder(root -> right); /* recur right */
printf("%c", root -> d);
}
}
/* Output: A C B E F D H J I G */
创建BTREE
/* Creating a binary tree. */
BTREE new_node(void)
{
return (malloc(sizeof(NODE)));
}
BTREE init_node (DATA d1, BTREE p1, BTREE p2)
{
BTREE t;
t = new_node();
t -> d = d1;
t -> left = p1;
t -> right = p2;
return t;
}
PS:一般栈区中的内存,系统会自己管理;作为Coder,我们只需管理堆区的内存分配&释放!
================
1 抽象数据类型(ADT)堆栈可以使用链表来实现,对它的限制在它的第一个元素(称为顶部)。堆栈具有后进先出(LIFO)的特性,这个行为是由push()和pop()函数实现。
2 ADT队列也可以用链表来实现,对它的访问限制在它的头部和尾部。队列具有先进先出(FIFO)的特性,这个行为是由enqueue()和dequeue()函数实现的。
3 当算法使用迭代方式实现时,需要使用一个迭代循环,在监测到NULL时终止。迭代算法的代价是需要使用辅助指针,但它的效率一般高于递归算法。
4 链表处理的标准算法用递归来实现非常自然。基本条件常常就是检测到NULL链。一般条件通过在链表结构中移动链来进行递归。
5 二叉树由包含两个链成员的结构来表示,它组合了线性链表的动态特征,并且可以非常快地访问树中的每个元素。二叉树的元素之间的距离通常是对数级的。
6 二叉树最常用使用三种遍历方法。每种访问方法是通过根节点的访问时间决定的。这三种遍历方式都可以用递归来实现,从左向右链接每棵子树。
7 PS:自引用结构使用指针来访问相同类型结构的地址!!最简单的自引用结构是线性链表。每个元素指向它的下一个元素,最后一个元素指向NULL。
8 malloc()函数用于动态内存分配。free()函数用于释放参数所指向的内存,把它返回给系统,供以后使用。
9 我们可以指定同时涉及链表和数组的具有可怕复杂性的数据结构。其中一个例子就是实现普通树。在普通树中,每个节点可以具有任意数量的孩子。节点的孩子由链表来表示,它由一个头元素数组所指向。
================
PS:
[ 每日一句 ]
“Nowadays, I don‘t really know where I‘m going, but I hope I go far. ”
[ 每天一首英文歌 ]
" This Love " - Taylor Swift
================
|-> GitHub: SpongeBob-GitHub
|--> Copyright (c) 2015 Bing Ma.
标签:
原文地址:http://www.cnblogs.com/SpongeBob-GitHub/p/4494255.html