算法学习 - 链表的游标实现~ 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;
}

算法是没有问题的,我写完之后测试了每个函数~

有什么问题请留言~

算法学习 - 链表的游标实现~ C++,布布扣,bubuko.com

时间: 2024-12-10 21:01:58

算法学习 - 链表的游标实现~ C++的相关文章

经典算法学习——链表实现冒泡排序

我在之前一篇博客<经典算法学习--冒泡排序>中简单实现了使用数组进行冒泡排序.这篇博客我们将来实现使用链表如何排序,其实整体的思路是一样的.示例代码上传至: https://github.com/chenyufeng1991/BubbleSortLinkedList . 算法描述如下: (1)比较相邻的前后两个数据,如果前面数据大于后面的数据,就将两个数据交换: (2)这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就到了最后一个位置,也就是下标为N-1的位置(沉到了水底).

经典算法学习——链表中倒数第k个节点

这是剑指Offer中非常经典的一道题,也是在面试笔试中高频出现.题目的详细描述如下:输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,从1开始计数,即链表的尾结点是倒数第一个节点. 本题有一个非常直观的解法,就是对链表扫描两遍,第一遍用来记录链表长度为n,第二次从链表头部走(n-k+1)步后,找到的那个节点就是倒数第k个节点.这种算法的问题就是需要扫描链表两遍,显得不是特别聪明. 其实多想想,这个算法模型和栈的形式非常像,我们只要从头开始扫描链表,把扫描到的每一个节点放入栈中,扫

算法学习 - 链表之归并排序_O(1)空间_O(NlogN)时间_C++

归并排序 归并排序我在之前已经讲过了,并且给了在数组的数列的情况下的归并排序方法,而排序的时间复杂度为O(NlogN).想看的话链接如下: 归并排序,快排,冒泡排序 但是这个归并排序有一个缺点:需要O(n)的额外空间. 那么这个缺点在什么情况下会解决呢?就是数列是以链表形式存储的时候!就不需要额外的申请O(n)级别的空间. 那么我们为什么要用归并排序呢? 不是还有快排,堆排么?都是速度很快的排序.其实在链表中是不适合的!因为在快排的时候,查找标杆是O(1)级别的,但是在链表中只能得到head节点

数据结构与算法学习02:链表

一.链表 链表是一种动态集合,它是由一系列元素组成的一个列表. 数组也可以实现列表这种数据结构,但数组是静态的,而链表是动态. 通常,我们定义一个结点类(或结构体)来表示链表的元素,它由两部分组成:数值域和指针域.数值域存储当前结点的键,指针域存储下一个节点的地址. template <class Type> struct nodeType { Type info; nodeType<Type> *link; }; 链表的一些基本操作如下: 初始化为空表 判断是否为空 打印(遍历)

经典算法学习——非循环双向链表实现冒泡排序(不带头结点)

我在前面两篇博客<经典算法学习--单链表(不带头结点)实现冒泡排序><经典算法学习--单链表实现冒泡排序(带头结点)>中详细描述了分别使用带头结点和不带头结点的单链表实现了冒泡排序,让我们对单链表和冒泡排序有了理性的认识.今天我们将会来使用不带头结点的非循环双向链表来实现冒泡排序,在处理过程中,这种冒泡比前面两种更为简单高效.代码上传至 https://github.com/chenyufeng1991/DoubleLinkedList_BubbleSort . 核心代码如下: /

计算机算法学习(1) - 不相交集合数据结构

不相交集合 故名思意就是一种含有多个不相交集合的数据结构.典型的应用是确定无向图中连通子图的个数.其基本操作包括: Make-Set(x):建立一个新的集合,集合的成员是x: Union(x,y): 将包含x和y的集合合并为一个集合: Find-Set(x): 返回指向包含x的集合的指针: 下面是一个例子,(a)是一个无向图,(b)是使用不相交集合来找连通子图的个数.做法是初始为各个顶点为一个集合,然后遍历各个边,把边的端点的集合进行合并,当处理完所有的边,能连通的顶点就在一个集合里了,这样就生

算法学习 - 树的一些解释

树的解释 树是ADT里面很经典的数据结构了,应用太多了,相对于链表的线性访问时间,O(n).树的大部分操作的平均运行时间都是为O(logN). - 树的概念 树有几种方式定义,一种是递归,若树不为空,则一棵树是由根(root)的节点r和0个或者多个非空树组成.N个节点的树,有N-1个边.没有儿子的节点称为叶子(leaf). 对于任意节点N(i),它的深度为从根节点到N(i)的唯一路径长度.如果存在N(1)到N(2)的路径,那么N(1)是N(2)的祖先.如果N(1)不等于N(2),那么就称为真祖先

算法学习01:二分查询,选择法、插入法、分治法排序

查询与排序是使用的再频繁不过的两个功能,算法学习系列实现语言为C#. 一般情况下的查询 Int32 Search(Int32[] source, Int32 task) { var index = 0; while (index < source.Length) if (source[index++] == task) return index - 1; //返回值为Length则说明未找到 return source.Length; } 时间复杂度为O(n),在检索源没有排序的情况下,这即为最

算法学习笔记

对于一个软件人员来说,算法和数据结构是无法逃避的,越是逃避说明越是需要继续学习和巩固.加深.转载一篇github上有关算法的文章,以便于进行继续学习和理解.当然并不是说非得全部掌握所有算法至少达到需要的时候会找,找到了会使,使完了能明白是什么东西才能更好的进行coding.这篇文章是有关C的 下次再弄个Java语言的算法部分.学无止境嘛,不能光看java也要学习学习C 学习方法 把所有经典算法写一遍 看算法有关源码 加入算法学习社区,相互鼓励学习 看经典书籍 刷题 原文地址:https://gi