郝斌数据结构(1)----数据结构基本分类和链表创建

10月24:
模块一: 线性结构
连续存储[数组]
离散存储[链表]
线性结构的两种常见应用之一 栈

**指针就是地址,地址就是指针:**

地址是内存单元的编号.
从0开始的非负整数
指针变量:是存放内存单元地址的变量
分类:
1. 基本类型的指针
2. 指针和数组的关系

10月25:
指针变量统一只占4个字节
10月26:
动态内存 int pArr = (int )malloc(sizeof(int ) *len); malloc只有一个形参, 形参表示int型的len分配4×len的字节空间

跨函数使用内存:
只能通过动态内存来实现

数据的存储结构有几种:
线性结构:把所有的结点用一根线穿起来
——–连续存储【数组】 优点:事先必须知道数组长度,需要大块的连续的内存块 存取速度快 缺点:插入删除元素很慢 空间通常是有限制的
——–离散存储【链表】 优点:插入删除元素很快 空间没有限制 缺点:存储元素很慢

线性结构的应用—栈和队列
非线性结构—-树 图 
10月30
链表: 首节点 尾节点 头结点(第一个有效节点之前的那个节点,不存放数据) 头指针 尾指针
处理链表只需要一个参数:头指针
链表参数有2个 数据域和指针域

#include <stdio.h> 
typedef struct Node
{
    int data;//数据域
    struct Node * pNext;//指针域
}NODE, *PNODE;//NODE等价于struct Node, PNODE等价

分类 单链表
双链表:每一个节点有两个指针域
循环链表:能通过任何一个节点找到其他所有的终点
非循环链表:
算法:
遍历
查找
清空
销毁
求长度
排序
插入节点
删除节点

例1 插入一个节点(将q指向的节点插入p后面)pq都只是指针变量,即地址(重难点)
①临时定义一个指向p后面节点的指针r
r=p->pNext; p->pNext=q; q->pNext=r;

q->pNext=p->pNext; p->pNext=q;

删除一个节点
r=p->pNext; p->pNext=r->pNext; delete(free) r;
p->pNext=p->pNext->pNext 不对内存没释放
表示p所指向结构体变量中的pNext成员本身,free p; 表示删除p指向节点所占的内存(堆),不是删除p本身所占内存(栈)

这里写图片描述

链表创建和链表遍历算法

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

typedef struct Node
{
    int data;//数据域
    struct Node * pNext;//指针域
}NODE, *PNODE;//NODE等价于struct Node, PNODE等价于struct Node *类型
PNODE create_list(void);
void traverse_list(PNODE pHead);

int main()
{
    PNODE pHead = NULL;
    pHead = create_list();
    traverse_list(pHead);

    return 0;
}

PNODE create_list(void)//有返回值 返回头结点的地址;返回类型为PNODE
{
    int len;//用来存放有效节点的个数
    int val;//用来临时存放用户输入的节点的值
    PNODE pHead = (PNODE)malloc(sizeof(NODE));//pHead指向头结点
    if (NULL == pHead)
    {
        printf("分配失败,程序终止!\n");
        exit(-1);
    }
    PNODE pTail = pHead;
    pTail->data = NULL;

    printf("请输入您需要生成的链表节点的个数: len = ");
    scanf("%d", &len);

    for (int i = 0; i < len; ++i)
    {
        printf("请输入第%d个节点的值: ", i + 1);
        scanf("%d", &val);

        PNODE pNew = (PNODE)malloc(sizeof(NODE));
        if (NULL == pNew)
        {
            printf("分配失败,程序终止\n");
            exit(-1);
        }
        pNew->data = val;
        pTail->pNext = pNew;
        pNew->pNext = NULL;
        pTail = pNew;
    }

    return pHead;
}

void traverse_list(PNODE pHead)
{
    PNODE p = pHead->pNext;

    while (NULL != p)
    {
        printf("%d ",p->data);
        p = p->pNext;
    }
    printf("\n");

    return;
}

链表排序算法算法:
狭义的算法是与数据的存储方式密切相关
广义的算法是与数据的存储方式无关的,这就是泛型思想
泛型: 利用某种技术达到的效果就是不同的存储方式,执行的操作是一样的
(可以用++重载)
怎样学习算法:
数据结构是专门研究数据存储的问题
狭义:数据的存储包含两方面:个体的存储+个体关系的存储 算法是对存储数据的操作
广义:数据结构既包括数据的存储也包含数据的操作 对存储数据的操作就是算法

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值