没有合适的资源?快使用搜索试试~ 我知道了~
声明一个structnode结构体类型的指针变量 b;4. 通常,“较稳定”的线性表选择顺序存储,而频繁做插入删除等“动态性”较强的线性表宜选择链式存储。(线性
资源详情
资源评论
资源推荐
1
【第一章:绪论】
1. 通常,用 O(1)表示常数计算时间。常见的渐进时间复杂度按数量级递增排列为:
O(1) < O(
2
log
n) < O(n) < O(n
2
log
n) < O(
2
n
) < O(
3
n
) < O(
n
2
)
2. 程序一定是算法:算法和程序的一个重要区别在于,程序不一定是有穷的,而算法必须
是有穷的。也就是说,一个算法必须具有有穷性,而程序则不一定。
【第二章:线性表】
3. 对于如下语句的理解:
typedef struct node
{
int data;
struct node *next;
}LNode,*LinkList;
这是定义一个结构体,这个结构体有两个属性,一个是 int 类型的 data; 另一个是这个结构
体本身类型的指针 next;
给这个结构定义了一个别名:LNode,一个指针别名:LinkList;
LNode a; 等价于 struct node a; 声明一个 struct node 结构体类型的结构体变量 a;
LinkList b; 等价于 struct node *b; 等价于 LNode *b; 声明一个 struct node 结构体类型的
指针变量 b;
4. 通常,“较稳定”的线性表选择顺序存储,而频繁做插入删除等“动态性”较强的线性
表宜选择链式存储。(线性表的存储分为顺序存储以及链式存储)
5. 【单链表逆置】算法思想:分为带头结点和不带头结点两种情况;
(1)带头结点的单链表逆置:保存第一个数据结点(即头指针指向的头结点的下一个结点)
至 p,此时,可以通过 p 访问到链表中的每一个结点。这时将原链表置空,再将 p 指向的结点
保存在 q 中,并让 p 指向 p 的下一个结点,将 q 插入头结点后即可。(利用了前插法)
代码如下:
void reverseWithHeadNode(LinkList H)
{
LNode *p,*q;
p = H->next;//让 p 指向第一个数据结点;
H->next = NULL;//原链表置空;
while(p)
{
q = p;//将当前数据结点保存在 q 中;
p = p->next;//当前结点指向下一个;
//将 q 插到头结点后;
q->next = H->next;
H->next = q;
}
}
(2)不带头结点的单链表逆置:新建一个空表 p,让 q 指向待操作的表。保存当前处理结
2
点的后继并取出待逆置结点。将该结点利用前插法插入新表中。
代码如下:
//注意带有返回值是因为创建了新表,而需要将原表逆置为新表
LinkList reverse(LinkList H)
{
LNode *p,*q;
p = NULL;//新建一个空表;
q = H;//让 q 指向待操作的表;
while(q != NULL)
{
q = (LNode *)malloc(sizeof(LNode));
q->data = H->data;
H = H->next;//保存当前结点的后继至 H;
//将待逆置结点 q 利用前插法插入新表 p;
q->next = p;
p = q;
q = H;//q 指向下一个待逆置结点
}
return p;
}
6. 队列采用链式存储结构,入队时只需申请新的结点,不存在队满的情况。
7. VC 规定结构体的各变量存放的起始地址相对于结构体的起始地址的偏移量必须是该变
量的类型所占字节数的倍数,并且整个结构体的字节数必须是该结构体中占用空间最大的类
型的字节数的整数倍。示例程序如下:
#include<iostream.h>
struct {char a; int b; double c;}a;//内存对齐方式:1 000 1111 11111111
struct {int b; char a; double c;}b;//内存对齐方式:1111 1 000 11111111
struct {char a; double c; int b;}c;//内存对齐方式:1 0000000 11111111 1000 0000
int main()
{
cout<<sizeof(a)<<endl;//16
cout<<sizeof(b)<<endl;//16
cout<<sizeof(c)<<endl;//24
return 0;
}
8. 试描述头指针和头结点的区别,并说明头指针和头结点的作用。
答:头指针是一个指针变量,用于存放链表中首结点的地址,并以此来标识一个链表。例如,
链表 H、链表 L 等,表示链表中第一个结点的地址存放在 H、L 中。
头结点则是附加在第一个元素结点之前的一个结点,头指针指向头结点。当该链表表示
一个非空的线性表时,头结点的指针域指向第一个元素结点;当为空表时,该指针域为空。
头指针的作用是用来唯一地标识一个单链表。
头结点的作用有两个:一是使得对空表和非空表的处理得以统一;而是在链表的第一个
位置上的操作和在其他位置上的操作一致,无需特殊处理。
3
9. 【删除重复元素】算法思想:用指针 p 指向第一个数据结点,从它的后继结点开始到表
的结束,找与其值相同的结点并删除之;p 指向下一个;以此类推,p 指向最后结点时算法
结束。代码如下:
//带有头结点的单链表中删除重复结点
void deleteRepeatElement(LinkList H)
{
LNode *p,*q,*r;
p = H->next;
if(p == NULL) return;
while(p->next)
{
q = p;
while(q->next)
{
if(q->next->data == p->data)
{
r = q->next;//删除结点时一定要先把结点保存起来
q->next = r->next;
free(r);//后来再释放掉空间
}
else
q = q->next;
}
p = p->next;
}
}
10. 排列组合公式:
11. 假设长度大于 1 的循环单链表中,既无头结点也无头指针,s 为指向该链表中某一结点
的指针,编写算法删除该结点的前驱结点。
算法思想:利用循环单链表的特点,可以通过给定的结点找到其前驱结点 p 及 p 的前驱结点
q,删除 p 即可。代码如下:
创建循环单链表的代码:
LinkList init(LinkList H)
{
剩余11页未读,继续阅读
艾法
- 粉丝: 19
- 资源: 319
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Picasso_v3.1 2.ipa
- chromedriver-mac-arm64.zip
- 蓝zapro.apk
- chromedriver-linux64.zip
- UCAS研一深度学习实验-MNIST手写数字识别python源码+详细注释(高分项目)
- 基于Python和PyTorch框架完成的一个手写数字识别实验源码(带MINIST手写数字数据集)+详细注释(高分项目)
- 基于Matlab在MNIST数据集上利用CNN完成手写体数字识别任务,并实现单层CNN反向传播算法+源代码+文档说明(高分项目)
- NVIDIA驱动、CUDA和Pytorch及其依赖
- 基于SVM多特征融合的微表情识别python源码+项目说明+详细注释(高分课程设计)
- html动态爱心代码一(附源码)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0