线性表之静态链表

#include<iostream>
#include <iomanip>
#include"windows.h"
using namespace std;
struct StaticLinkNode
{
    int data;
    int next;
};
struct StaticLink
{
    StaticLinkNode* nodes;
    int maxCnt;
    int cnt;
};
StaticLink createStaticLink(int max)
{
    StaticLink p;
    p.nodes=new StaticLinkNode[max+2];
    for(int i=0;i<max;i++)
        p.nodes[i].next=i+1;
    p.nodes[max].next=0;
    p.nodes[max+1].next=0;
    p.maxCnt=max;
    p.cnt=0;
    return p;
}
int getSpare(StaticLink* p)
{
    int first = (*p).nodes[0].next;
    if(first!=0)
        (*p).nodes[0].next = (*p).nodes[first].next;
    return first;
}
void releaseToSpare(StaticLink* p,int i)
{
    int first = (*p).nodes[0].next;
    (*p).nodes[i].next=first;
    (*p).nodes[0].next=i;
}
bool add(StaticLink* p,int i,int value)
{
    int target =getSpare(p);
    if(target==0)
        return 0;
    int first =(*p).maxCnt+1;
    for(int j=0;j<i-1 && first;j++)
        first = (*p).nodes[first].next;
    if(first!=0)
    {
        (*p).nodes[target].data=value;
        (*p).nodes[target].next = (*p).nodes[first].next;
        (*p).nodes[first].next=target;
        (*p).cnt++;
        return 1;
    }
    return 0;
}
bool remove(StaticLink* p,int i)
{
    int first =(*p).maxCnt+1;
    if(first==0)
        return 0;
    for(int j=0;j<i-1 && (*p).nodes[first].next;j++)
        first = (*p).nodes[first].next;
    if((*p).nodes[first].next)
    {
        int t=(*p).nodes[first].next ;
        (*p).nodes[first].next = (*p).nodes[(*p).nodes[first].next].next;
        releaseToSpare(p,t);
        (*p).cnt--;
        return 1;
    }
    return 0;
}
void output(StaticLink* p)
{
    int first =(*p).nodes[(*p).maxCnt+1].next;
    while(first!=0)
    {
        cout<<(*p).nodes[first].data<<" ";
        first=(*p).nodes[first].next;
    }
    cout<<endl;
}
void main()
{
    int max=28;
    StaticLink p= createStaticLink(28);
    for(int i=0;i<15;i++)
    {
        int x = rand()%100;
        cout<<x<<" ";
        add(&p,p.cnt+1,x);
    }
    cout<<endl;
    output(&p);

    add(&p,2,45);
    output(&p);

    add(&p,1,55);
    output(&p);

    add(&p,p.cnt,65);
    output(&p);
    add(&p,p.cnt+1,75);
    output(&p);

    remove(&p,2);
    output(&p);

    remove(&p,1);
    output(&p);

    remove(&p,p.cnt);
    output(&p);
    remove(&p,p.cnt+1);
    output(&p);

    cin>>max;
}
时间: 2024-10-17 11:13:12

线性表之静态链表的相关文章

数据结构与算法(三)-线性表之静态链表

前言:前面介绍的线性表的顺序存储结构和链式存储结构中,都有对对象地引用或指向,也就是编程语言中有引用或者指针,那么在没有引用或指针的语言中,该怎么实现这个的数据结构呢? 一.简介 定义:用数组代替指针或引用来描述单链表,即用数组描述的链表叫做静态链表,这种描述方法叫做游标实现法: 上面的静态链表图有两个数组游标和数据,其中数据数组存储数据,而游标数组存储同下标为数据的下一个数据的下标值,简单模拟一下静态链表遍历的过程: 先查看下标为999的游标数组值:1: 根据游标数组值1,查找下标为1的数据:

Java数据结构-线性表之静态链表

静态链表的定义: 节点由一个一维数组和一个指针域组成,数组用来存放数据元素,而指针域里面的指针(又称游标)用来指向下一个节点的数组下标.这样的链表称之为静态链表. 链表中的数组第一个和最后一个位置需要特殊处理,不存数据.第一个位置(即数组0下标)的节点的指针用来存放备用链表的第一个节点的数组下标.最后一个位置(即数组长度MaxSize-1下标)的节点的指针用来存放指向有数值的第一个数据元素的数组下标,类似于单链表的头结点. 静态链表的示例图: 下面举一个摘抄自<大话数据结构>的例子,来解释一下

数据结构之第二章线性表之静态链式存储

1--特点:用一维数组来描述线性表,用游标代替指针指示节点在数组中的相对位置.不设“指针”类型的高级语言中适用链表结构. 2--线性表的静态链式存储结构 ////  静态单链表.h//  单链表的静态存储//// 6 //  Copyright (c) 2014年 dashuai. All rights reserved.// #ifndef SLIST_H#define SLIST_H#include <stdio.h>#include <stdlib.h> #define MA

续上文----线性表之单链表(C实现)

本文绪上文线性表之顺序表(C实现) 本文将继续使用单链表实现线性表 的另外一种存储结构.这种使用 链表实现的存储结构在内存中是 不连续的. C实现代码如下: #include<stdio.h> typedef struct node { int data; struct node *next; }Node; //链表的初始化 Node* InitList(int number) { int i; Node *pHead=(Node *)malloc(sizeof(Node)); Node *T

[大话数据结构]线性表之单链表结构和顺序存储结构

线性表定义: 零个或者多个数据元素的有限序列.元素之间是有顺序的,如果元素存在多个,则第一个元素无前驱,最后一个元素无后继.其他每个元素都有且只有一个前驱和后继.并且数据元素的类型要相同. 线性表的抽象数据类型: ADT 线性表(List) Data 线性表的数据对象集合为{a1,a2,...,an},每个元素的类型均为DataType. 其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素. 数据元素之间的关系是一对一的关系.

c/c++ 线性表之单向链表

c/c++ 线性表之单向链表 线性表之单向链表 不是存放在连续的内存空间,链表中的每个节点都指向下一个节点,最后一个节点的下一个节点是NULL. 真实的第一个节点是头节点,头节点不存放数据,单纯为了编写程序方便.但是下面注释里写的[第一个节点]的含义是头节点的下一节点,也就是真实存放数据的第一个节点. 下面的代码实现了以下功能 函数 功能描述 push_back 从链表的最后插入节点 push_front 从链表的起始插入节点 show_list 打印出链表里每个节点的值 pop_back 删除

数据结构学习总结(2) 线性表之单链表

一,回忆链表 链表,别名链式存储结构或单链表,用于存储逻辑关系为 "一对一" 的数据.与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其物理存储位置是随机的. 例如,使用链表存储 {1,2,3},数据的物理存储状态如图 1 所示: 图 1 链表随机存储数据 我们看到,图 1 根本无法体现出各数据之间的逻辑关系.对此,链表的解决方案是,每个数据元素在存储时都配备一个指针,用于指向自己的直接后继元素.如图 2 所示: 图 2 各数据元素配备指针 像图 2 这样

Java数据结构-线性表之单链表LinkedList

线性表的链式存储结构,也称之为链式表,链表:链表的存储单元可以连续也可以不连续. 链表中的节点包含数据域和指针域,数据域为存储数据元素信息的域,指针域为存储直接后继位置(一般称为指针)的域. 注意一个头结点和头指针的区别: 头指针: 指向链表的第一个节点的指针,若链表有头结点,则是指向头结点的指针: 头指针具有标识作用,所以常用头指针作为链表的名字: 不论链表是否为空,头指针都不为空: 是链表的必要元素. 头结点: 头结点是为了操作的统一和方便而设立的,放在第一个元素节点的前面,其数据域一般无意

线性表之单链表学习小结(初学数据结构必看)

花了好几个小时,详细规划出了整个过程,包括所有基本操作...有什么疑问请下方留言 #include<iostream> using namespace std; #define ElemType char #define ERROR 0 #define OK 1 typedef struct Node { ElemType data; struct Node *next; }Node,*LinkList; void init_linklist(LinkList L)/*对单链表进行初始化*/