多数组实现链表结构 c++实现代码

对每个属性使用一个数组表示,多数组可以表示一组同构的对象。指针放在额外的数组中,用下标来表示。

这次实现代码基于10.3-5, 主要为了实现compacitify 操作,即把链表的所有元素在存储器中保持紧凑,本题是都放到前n个位置(n个元素)。

思想是从网上看来的,移动元素的过程中保持链表中元素的相互指向不变,而自由表中并不需要,因为它什么都没有存储。

这里实现了一个List_Freelist类,支持Delete,Insert,Compacitify,Print,Get_Next 等操作。

#include <iostream>
#include <vector>

using namespace std;
const int M = 100;

class List_Freelist{
public:
    List_Freelist(int totalsize);
    void Delete(int x);
    void Insert(int key);
    void Compactify();
    int Get_Next(int x);
    void Print();
    ~List_Freelist(){}
private:
    vector<int> next;
    vector<int> key;
    vector<int> prev;
    int free_list; //head of freelist
    int list;      //head of list
    int Allocate_Object();
    void Free_Object(int x);
};

List_Freelist::List_Freelist(int totalsize){
    if (totalsize <= 0)
    {
        cout << "size too small";
        throw;
    }
    next.resize(totalsize);
    key.resize(totalsize);
    prev.resize(totalsize);
    list = -1;
    free_list = 0;
    for (int i = 0; i < totalsize - 1; ++i)
        next[i] = i + 1;
    next[totalsize - 1] = -1;
}

void List_Freelist::Delete(int x) {
    if (prev[x] == -1 && next[x] == -1)
        list = -1;
    if (prev[x] != -1)
        next[prev[x]]=next[x];
    if (next[x] != -1)
        prev[next[x]] = prev[x];
    Free_Object(x);
}

int List_Freelist::Allocate_Object(){
    if (free_list == -1)
    {
        cout << "overflow";
        throw;
    }
    int temp = free_list;
    free_list = next[free_list];
    return temp;
}

void List_Freelist::Free_Object(int x){
    next[x] = free_list;
    free_list = x;
}

void List_Freelist::Insert(int value){
    int temp = Allocate_Object();
    key[temp] = value;
    prev[temp] = -1;
    next[temp] = list;
    if (list != -1)
        prev[list]=temp;
    list = temp;
}

int List_Freelist::Get_Next(int x){
    if (next[x] == -1){
        cout << "end of list";
        throw;
    }
    else return key[next[x]];
}
void List_Freelist::Print(){
    if (list == -1){
        cout << "empty list";
        return;
    }
    int temp = list;
    while (next[temp] != -1){
        cout << key[temp]<<" ";
        temp = next[temp];
    }
}
void List_Freelist::Compactify(){
    if (free_list == -1)
        return;
    if (list == -1)
        return;
    int i = free_list;
    while (i != -1){
        prev[i] = INT_MIN;
        i = next[i];
    }
    int left = 0, right = next.size() - 1;
    while (true){
        while (prev[left] != INT_MIN&&left<right)//防止溢出
            ++left;
        while (prev[right] == INT_MIN)
            --right;
        if (left >= right)
            break;
        prev[left] = prev[right];
        key[left] = key[right];
        next[left] = next[right];

        next[right] = left;//记录交换之后链表元素的地址
        ++left;
        --right;
    }

    ++right;
    //整理链表,保证其正确性
    for (int i = 0; i < right; ++i){
        if (prev[i] >= right)
            prev[i] = next[prev[i]];
        if (next[i] >= right)
            next[i] = next[next[i]];
    }
    //更新链表head
    if (list >= right)
        list = next[list];
    //整理自由表
    for (int i = right; i < next.size()-1; i++)
        next[i] = i + 1;
    next[next.size() - 1] = -1;
    //更新自由表head
    free_list = right;
}

int main(){
    List_Freelist lf(15);
    for (int i = 0; i < 15; ++i)
        lf.Insert(i);
    lf.Print();
    cout << endl;
    lf.Delete(2);
    lf.Delete(4);
    lf.Delete(6);
    lf.Print();
    cout << endl;
    lf.Compactify();
    lf.Print();
    cout << endl;
}
时间: 2024-10-11 00:51:18

多数组实现链表结构 c++实现代码的相关文章

数据存储的常用结构 堆栈、队列、数组、链表

数据存储的常用结构有:堆栈.队列.数组.链表.我们分别来了解一下: 堆栈,采用该结构的集合,对元素的存取有如下的特点: 先进后出(即,存进去的元素,要在后它后面的元素依次取出后,才能取出该元素).例如,子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当开枪时,先弹出上面的子弹,然后才能弹出下面的子弹. 栈的入口.出口的都是栈的顶端位置 压栈:就是存元素.即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置. 弹栈:就是取元素.即,把栈的顶端位置元素取出,栈中已有元素依次

c语言实现线性结构(数组与链表)

由于这两天看了数据结构,所以又把大学所学的c语言和指针"挂"起来了. 我是小菜鸟,我为自己代言.下面是我这两天学习的成果(数组和链表的实现,用的是c语言哦!哈哈). (一)数组的实现和操作.代码如下: #include <stdio.h> #include <malloc.h> #include <stdlib.h> struct Array{ int length;//数组长度 int * pBase;//存放数组首元素的地址 int cnt;//

数组和链表的区别以及数组和结构体的区别

1,数组和链表的区别? 链表和数组都叫可以叫做线性表, 数组又叫做顺序表,主要区别在于,顺序表是在内存中开辟一段连续的空间来存储数据,而且必须是相同类型的数据. 而链表是通过存在元素中的指针联系到一起的,每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域,链表既可以靠指针来连接多块不连续的的空间也可以用一段连续的空间, 在逻辑上形成一片连续的空间来存储数据. 两种数据结构各有各的好处,链表方便删除和插入,数组方便排序等. 数组从栈中分配空间, 对于程序员方便快速

java实现链表结构详细代码

一.数据准备 1. 定义节点 2.   定义链表 1.数据部分 2.节点部分 class DATA //数据节点类型 { String key; String name; int age; } class CLType //定义链表结构 { DATA nodeData =new DATA(); CLType nextNode; } 二.追加节点 首先分配内存,保存新增节点 从头应用head开始追个检查,直到找到最后结点 将表尾结点地址部分设置为新增节点的地址 将新增节点的地址部分置为null C

1) 链表顺序存储---之二代码

参考文档: 1)<<大话数据结构>> 2)http://blog.chinaunix.net/uid-20680669-id-147844.html 3)http://blog.csdn.net/strommaybin/article/details/51919464 1. 线性表(list): 零个或多个数据元素的有限序列 线性表(Linear_list)是最常用也是最简单的数据结构.简言之,一个线性表是n个数据元素的有限序列.线性表是有线性结构的表.什么是线性结构呢?线性结构是

程序员修炼之路-(2)线性表(上):数组与链表

1 两块基石 数组与链表构成各种数据结构的基石,是实现所有数据结构必不可少的元素. 1.1 数组 数组一般内置于编程语言中,直接通过索引(index)读写.索引一般为数字,有的语言甚至直接支持如字符串等其他类型的索引.在很多数据结构中都能看到数组的身影,例如字符串.动态数组.堆.栈和队列(用链表也可以,但用数组实现很高效)等. 1.2 链表 概念上都能理解,但实现起来还真有很多容易出错的地方. 实现细节 ?  表头(header):为什么要添加一个表头?因为有了表头,在第一个结点前添加结点或删除

队列的数组和链表实现

队列的单链表实现 queue.h #ifndef QUEUE_H_ #define QUEUE_H_ typedef int ElementType; #ifndef _QUEUE_LIST_ #define _QUEUE_LIST_ struct QNode; typedef struct QNode * QNodePtr; struct QNode { ElementType Element; QNodePtr Next; }QNode; typedef struct Node { QNod

详解数组,链表和ADT

数组 先由一个例子复习一下数组的操作: class HighArray { private long[] a; private int nElems; //----------------------------------- public HighArray(int max) //构造函数 { a=new long[max]; nElems = 0; } //----------------------------------- public boolean find(long searchK

数组、链表及其性能

猛戳链接阅读最终版 病人:医生医生,我一啪啪就蛋疼 医生:那就别啪 我在Twitter上说过: 你提醒过我使用 reduce 的方式构建数组虽然有趣,但有使性能减半的风险. 很多人觉得这句话很奇怪,这让我非常惊讶.相当一部分人建议将 reduce 版本改成不做数组拷贝的(我不认为这样是可行的).也有建议说需要对 + 运算符做优化,让它不做拷贝操作(我同样不认为这样做很简单,而且很快我们就会意识到这一点). 其他人建议我除非文档有提到,不然就不需要在意这些细枝末节的问题(而我认为这是在编写代码时必