一、数据结构和算法
数据结构研究变量的管理方式
算法研究解决特定问题的方法
二、逻辑结构和物理结构
1.区别
(1).逻辑结构指人对数据之间关系的理解和看法
逻辑结构和计算机无关
(2).物理结构描述计算机内部数据之间实际的关系
(3).任何一种数据结构都包含逻辑结构和物理结构这两方面,他们之间的差别可能非常大
2.逻辑结构
(1).集合结构:这种结构表示数据可以合并成一个整体
(2).线性结构:这种结构中数据之间有一对一的关系
(3).树型结构:这种结构中数据之间有一对多的关系(这个关系称为父子关系)
(4).网状结构:这种结构中数据之间有多对多的交叉映射关系
3.物理结构
(1).顺序结构:结构中的数据元素存放在一段连续的内存空间中,典型代表就是数组
特点:随机访问方便,但是插入删除复杂
(2).链式结构:这种结构中不同的数据被存储在计算机里不同的地方,他们的物理位置之间完全没有关系。链式结构由多个节点构成,每个节点是一个结构体变量。每个节点中
包括有效数据和至少一个指针变量
(3).对链式结构进行操作时如果不会修改结构则使用一级指针变量就行,如果会修改结构则要使用二级指针变量
(4).链式结构适合进行插入删除操作,不适合进行随机访问
(5).逻辑结构可以采用多种物理结构实现,他们之间没有明确的一对一的关系
4.简单的demo(给自己看的,大神求轻点吐槽)
(1)简单的链式结构的实现
typedef struct node{
int num;
struct node *p_next;
}node;
node node1 = {1,NULL};
int main(int argc, const char * argv[]) {
node *p_head = NULL;
node node2 = {2,NULL};
node node3 = {3,NULL};
p_head = &node1;
node1.p_next = &node2;
node2.p_next = &node3;
while (p_head != NULL)
{
printf("%d",p_head->num);
p_head = p_head -> p_next;
}
printf("\n");
return 0;
}
(2)顺序存储结构实现栈
int stack[10];
int size = 0;
bool is_empty()
{
return size==0;
}
bool is_full()
{
return size==10;
}
void init()
{
}
void destroy()
{
size=0;
}
void push(int num)
{
stack[size++] = num;
}
void pop()
{
size--;
}
int peak()
{
return stack[size - 1];
}
int main(int argc, const char * argv[]) {
push(1);
push(2);
push(3);
printf("%d\n",peak());
pop();
printf("%d\n",peak());
pop();
printf("%d\n",peak());
push(4);
printf("%d\n",peak());
return 0;
}
(3)用链式存储结构来实现栈
typedef struct node{
int num;
struct node *p_next;
}node;
node head;
bool is_empty()
{
return !head.p_next;
}
bool is_full()
{
return false;
}
void init()
{
}
void pop()
{
if (head.p_next)
{
node *p_tmp = head.p_next;
head.p_next = p_tmp->p_next;
free(p_tmp);
p_tmp = NULL;
}
}
void push(int num)
{
//别忘了开辟存储空间的这步啊!!!
node *p_node = (node *)malloc(sizeof(node));
if (p_node == NULL)
{
return;
}
p_node->num = num;
p_node->p_next = head.p_next;
head.p_next = p_node;
}
void destroy()
{
while (head.p_next)
{
pop();
}
}
int peak()
{
if (head.p_next)
{
return head.p_next->num;
}
else
{
return -1;
}
}
int main(int argc, const char * argv[])
{
init();
push(1);
push(2);
push(3);
printf("%d ",peak());
pop();
printf("%d ",peak());
pop();
push(4);
printf("%d\n",peak());
pop();
printf(is_empty()?"空\n":"非空\n");
destroy();
printf(is_empty()?"空\n":"非空\n");
return 0;
}
(4)顺序存储结构实现队列
int stack[10];
int size=0;
bool is_empty()
{
return size==0;
}
bool is_full()
{
return size==10;
}
void init()
{
}
void destroy()
{
size=0;
}
void pop()
{
int i=0;
while(i < size)
{
stack[i] = stack[i+1];
i++;
}
size--;
}
int push(int num)
{
return stack[size++] = num;
}
int peak()
{
return stack[0];
}
int main(int argc, const char * argv[]) {
init();
push(1);
push(2);
push(3);
printf("%d",peak());
pop();
printf("%d",peak());
pop();
printf("%d",peak());
push(4);
printf("%d",peak());
pop();
printf("%d\n",peak());
printf(is_empty()?"空\n":"非空\n");
destroy();
printf(is_empty()?"空\n":"非空\n");
return 0;
}
(4)用链式存储结构来实现队列
typedef struct node{
int num;
struct node *p_next;
}node;
node head;
bool is_empty()
{
return !head.p_next;
}
bool is_full()
{
return false;
}
void pop()
{
if (head.p_next)
{
node *p_tmp = head.p_next;
head.p_next = p_tmp->p_next;
free(p_tmp);
p_tmp = NULL;
}
}
void init(){}
void destroy()
{
while (head.p_next != NULL)
{
pop();
}
}
void push(int num)
{
node *p_tmp = &head;
node *p_node = (node *)malloc(sizeof(node));
if (p_node == NULL)
{
return;
}
p_node->num = num;
p_node->p_next = NULL;
while (p_tmp->p_next != NULL)
{
p_tmp = p_tmp->p_next;
}
p_tmp->p_next = p_node;
}
int peak()
{
if (head.p_next!=NULL)
{
return head.p_next->num;
}
else
{
return -1;
}
}
int main(int argc, const char * argv[]) {
push(1);
push(2);
push(3);
printf("%d ",peak());
pop();
printf("%d ",peak());
pop();
printf("%d\n",peak());
printf(is_empty()?"空\n":"非空\n");
pop();
destroy();
printf(is_empty()?"空\n":"非空\n");
return 0;
}