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