part03- 数据结构基本知识

一、数据结构和算法

数据结构研究变量的管理方式
算法研究解决特定问题的方法


二、逻辑结构和物理结构

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;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值