学习算法 - 表指针实现~ C++

表指针实现。第二种方法是使用访问列表,模拟指针。

在我的理解中学习,它是创建一个节点数组,模拟存储装置,然后从中分配内存和释放内存。

但实际的内存没有被释放~

下面的代码直接附着:

//
//  main.cpp
//  CursorList
//
//  Created by Alps on 14-7-27.
//  Copyright (c) 2014年 chen. All rights reserved.
//

#include <iostream>

#define CursorSpace 100
#define ElementType int

using namespace std;

typedef int PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;

void InitializeCursorList(void);
List MakeEmpty(List L);
int isEmpty(List L);
int isLast(List L, Position P);
void Insert(List L, Position P, ElementType X);
void Delete(List L, ElementType X);
Position Find(List L, ElementType X);
Position FindPrevious(List L, ElementType X);
void DeleteList(List L);

struct Node{
    ElementType X;
    Position Next;
};

struct Node CursorList[CursorSpace];

int isEmpty(List L){
    return CursorList[L].Next == 0;
}

int isLast(List L, Position P){
    return CursorList[P].Next == 0;
}

void InitializeCursorList(void){
    int i = 0;
    for (i = 0; i < CursorSpace; i++) {
        CursorList[i].Next = i + 1;
    }
    CursorList[CursorSpace - 1].Next = 0;
}

Position CursorAlloc(){
    Position P;
    P = CursorList[0].Next;
    CursorList[0].Next = CursorList[P].Next;
    CursorList[P].Next = 0;
    return P;
}

void CursorFree(Position P){
    CursorList[P].Next = CursorList[0].Next;
    CursorList[0].Next = P;
}

Position Find(List L, ElementType X){
    Position P = CursorList[L].Next;
    while (CursorList[P].X != X && P) {
        P = CursorList[P].Next;
    }
    if (P == 0) {
        return false;
    }
    return P;
}

Position FindPrevious(List L, ElementType X){
    Position P = L;
    Position tmp = CursorList[P].Next;
    while (CursorList[tmp].X != X && tmp) {
        tmp = CursorList[tmp].Next;
        P = CursorList[P].Next;
    }
    return P;
}

void Delete(List L, ElementType X){
    Position P = FindPrevious(L, X);
    Position tmp = CursorList[P].Next;
    CursorList[P].Next = CursorList[tmp].Next;
}

void Insert(List L, Position P, ElementType X){
    Position tmp;
    tmp = CursorAlloc();
    CursorList[tmp].X = X;
    CursorList[tmp].Next = CursorList[P].Next;
    CursorList[P].Next = tmp;
}

void DeleteList(List L){
    Position P = CursorList[L].Next;
    Position tmp = P;
    while (tmp != 0) {
        P = CursorList[P].Next;
        CursorFree(tmp);
        if (P == 0) {
            break;
        }
        tmp = P;
    }
    CursorList[L].Next = 0;
}

void Print(List L){
    Position P = CursorList[L].Next;
    while (P != 0) {
        printf("%d ",CursorList[P].X);
        P = CursorList[P].Next;
    }

    printf("\n");
}

int main(int argc, const char * argv[])
{

    printf("start ...\n");
    InitializeCursorList();
    List L = CursorAlloc();
    Insert(L, L, 1);
    Insert(L, L, 3);
    Insert(L, L, 5);
    Insert(L, L, 4);
    Print(L);
    Position P = FindPrevious(L, 3);
    printf("%d\n",P);
    Delete(L, 3);
    Print(L);
    DeleteList(L);
    Print(L);
    return 0;
}

算法是没有问题。之后,我每一个功能考完试~

有任何疑问,请留言~

时间: 2024-10-26 19:12:46

学习算法 - 表指针实现~ C++的相关文章

C++ Primer 学习笔记_35_面向对象编程(6)--虚函数与多态(三):虚函数表指针(vptr)及虚基类表指针(bptr)、C++对象模型

C++ Primer 学习笔记_35_面向对象编程(6)--虚函数与多态(三):虚函数表指针(vptr)及虚基类表指针(bptr).C++对象模型 一.虚函数表指针(vptr)及虚基类表指针(bptr) C++在布局以及存取时间上主要的额外负担是由virtual引起的,包括: virtual function机制:用以支持一个有效率的"执行期绑定": virtual base class:用以实现多次在继承体系中的基类,有一个单一而被共享的实体. 1.虚函数表指针 C++中,有两种数据

写在前面:21天学习算法

最近打算找一份新的工作,感到自己在算法环节还很疲弱.由于时间还算充裕,就决定将LeetCode上面的算法题学一遍,找出自己的薄弱,锻炼算法思维,吸收他人长处.个人觉得,刷题只是学习算法中的一个环节,主要的作用是用来反馈错误和增加熟练度.相比较刷题,更加重要的是对比和总结,对比自己的代码和他人的代码,对比不同的解法,总结一类算法或一类问题,总结一些tips,这两步是提升自己的关键.另外,为了不让自己的视野过于局限,让得到的碎片化学习成果体系化,可以在刷题的时候,就某方面的算法或数据结构,多参考其他

数据结构学习---顺序表

在准备考研的时候就想发学习笔记,想来已经过了多时.现在在培训班又要展开学习,说明一件事:408是指导学习研究计算机的基础!对于编写程序而言,数据结构与算法,是关键!我想其他的组成原理,计算机网络,操作系统也很重要,这是一个system,有必要有需要学习认真的学习之.希望这个是好的开始! ---------------------------------------------------------------- 昨天晚上看浙大在网易云课上的视频,没有上过浙大的我还是非常激动,哈哈,三个短视频看

黑马程序员学习笔记-C指针小结

黑马程序员学习笔记-C指针 1. 指针简介: 指针是C语言中非常重要的数据类型,是C语言的精华 2. 指针变量定义: 格式:类名标识符 *指针变量名; 指针变量只能存储地址 指针就一个作用:能够根据一个地址值,访问对应的存储空间 指针变量p前面的int:指针变量只能指向int类型的数据 3.实例: 4. 注意点: 指针变量只能存储地址.指针变量未经初始化,不要拿来间接访问其他存储空间.指针变量的初始化可以int *p = &a;也可以拆分成两句:int *p; p =&a;.定义变量时的*

机器学习算法笔记2_1:生成学习算法(Generative Learning algorithms)

我们之前学习的算法都是基于p(y|x;θ), 他的思想是找出找出一个决策边界来将两类分开,而生成算法是先对两个类别分别建模,为了将样本分开,将样本代入两个模型,看样本与哪个类别更匹配. 这种试图直接从输入x映射到类别标签{0,1}的算法被称为判别学习算法:而通过计算p(x|y)(和p(y))来得到模型的算法被称为生成学习算法 通过贝叶斯函数得到p(y|x)=p(x|y)p(y)p(x), argmaxyp(y|x)=argmaxyp(x|y)p(y)p(x)=argmaxyp(x|y)p(x)

斯坦福大学公开课机器学习:advice for applying machine learning | learning curves (改进学习算法:高偏差和高方差与学习曲线的关系)

绘制学习曲线非常有用,比如你想检查你的学习算法,运行是否正常.或者你希望改进算法的表现或效果.那么学习曲线就是一种很好的工具.学习曲线可以判断某一个学习算法,是偏差.方差问题,或是二者皆有. 为了绘制一条学习曲线,通常先绘制出训练集数据的平均误差平方和(Jtrain),或者交叉验证集数据的平均误差平方和(Jcv).将其绘制成一个关于参数m的函数.也就是一个关于训练集.样本总数的函数.m一般是一个常数,比如m等于100,表示100组训练样本.但我们要自己取一些m的值,也就是说对m的取值做一点限制,

生成学习算法

生成学习算法引入 目前为止,我们主要讲解了条件概率模型p(y|x,θ)的学习算法.接下来,我们将讨论其他的学习算法.接下来举个例子,比如现在遇到一个分类问题,基于一些特征来判断一个动物是大象 (y = 1) 还是小狗 (y = 0).基于给定的数据集,我们可以采用logistic回归或者感知器学习的方法来寻找一条直线(称之为决策边界)把大象和小狗分割开割开来.之后预测新的动物时,只要判断它在决策边界的哪一边就可以预测其所属分类. 现在有另外一种方法.首先是查看大象的数据,然后建立一个什么是大象的

Ensemble_learning 集成学习算法 stacking 算法

原文:https://herbertmj.wikispaces.com/stacking%E7%AE%97%E6%B3%95 stacked 产生方法是一种截然不同的组合多个模型的方法,它讲的是组合学习器的概念,但是使用的相对于bagging和boosting较少,它不像bagging和boosting,而是组合不同的模型,具体的过程如下:1.划分训练数据集为两个不相交的集合.2. 在第一个集合上训练多个学习器.3. 在第二个集合上测试这几个学习器4. 把第三步得到的预测结果作为输入,把正确的回

C学习笔记 - 指针

指针与数组 int a[] = {1,2,3,4,5}; int *p; p = a; printf("*a = %d\n",*a); printf("*p = %d\n",*p); printf("a[1] = %d\n",a[1]); printf("p[1] = %d\n",p[1]); 数组名就是数组的首地址.以上输出结果都一样.数组名基本上和指针等价.但a是常量,不可以进行a++或者a+=1等操作,而指针p则可以.