静态链表代码

早期的编程语言不像C语言拥有指针功能,但是又希望能够实现单链表,

于是在数组的基础上创建了单链表,称为静态链表。

/*************************************
                静态链表
数据结构:每个数组节点都有值和游标.
游标表示下一个节点,节点分为已用节点和备用节点
第一个节点和最后节点保留:
第一个节点游标表示备用节点起始位置
最后一个节点游标表示已用节点的起始位置
已用节点的最后一个元素的游标指向0,表示末尾。
*************************************/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#define ERROR 0
#define OK 1
#define MAX 100     //声明数组的最大长度

typedef int Status,ElemType;
typedef struct{
   int data;    //数据
   int cur;     //游标
}component,staticlink[MAX]; //定义结构体数组

/**********************************
         初始化链表
输入值:链表的指针
输出值:状态码
功能:  将所以节点的游标指向后一个节点
 ***********************************/
Status initLink(staticlink space){
  int i;
  for(i=0;i<(MAX-1);i++){  //遍历所有节点
    space[i].cur = i+1;  //将节点的游标指向下个节点
  }
  space[MAX-1].cur = 0;    //最后一个节点的游标指向第一个节点
  return OK;
}

/*********************************
         分配备用空间
输入值:链表的指针
输出值:备用节点的下标
功能:  将备用节点的分配出来使用
 *********************************/
int mallocSpace(staticlink space){
  int i;
  i = space[0].cur;          //取出第一个备用节点
  if(space[0].cur)           //如果取出成功
    space[0].cur = space[i].cur;    //第一个节点的指针往后移动
  return i;
}

/********************************
         获取长度
输入值:链表的指针
输出值:长度值
功能:  将链表中已用的节点个数返回
 ********************************/
int getLength(staticlink space){
  int mov = MAX-1;
  int j=0;
  while(space[mov].cur){    //遍历所有已用节点
    mov = space[mov].cur;
    j++;
  }
  return j;
}
/*********************************
          创建值
输入值:链表的指针,初始值个数
输出值:状态码
功能:  为链表初始指定个数的随机值
 *********************************/
Status createValue(staticlink space,int num){
  srand(time(0));
  int i,mov = MAX-1;
  space[mov].cur = 1;
  for(i=0;i<num;i++){
    mov = space[mov].cur;        //移动游标
    space[mov].data = rand()%100+1;  //初始化随机值
  }
  space[0].cur = space[mov].cur;     //第一节点游标指向备用节点
  space[mov].cur = 0;           //最后一个已用节点指向第一个节点
  return OK;
}

/*********************************
          插入节点
输入值:链表的指针,插入位置(从1开始),插入位置
输出值:状态码
功能:  在指定的位置插入指定的值
 *********************************/
Status insertNode(staticlink space,int index,ElemType e){
  int new,mov,i;
  if(index<1 || index>getLength(space))return ERROR;  //不可以超过已用节点个数

  mov = MAX-1;
  new = mallocSpace(space);

  if(new){
    space[new].data=e;            //创建新节点
    for(i=1;i<index;i++)           //定位插入节点的前一节点
      mov = space[mov].cur;

    space[new].cur = space[mov].cur;    //连后
    space[mov].cur = new;          //接前
    return OK;
  }
  return ERROR;
}

/************************************
          删除节点
输入值:链表的指针,删除位置(从1开始)
输出值:状态码
功能:  删除指定的节点
 ************************************/
Status deleteNode(staticlink space,int index){
  if(index<1 || index>getLength(space))return ERROR;
  int mov,next,i;

  mov = MAX-1;
  for(i=1;i<index;i++)        //定位删除节点的前一节点
    mov = space[mov].cur;

  next = space[mov].cur;       //获取被删节点
  space[mov].cur = space[next].cur; //前一节点连接被删节点的游标
  freeNode(space,next);       //释放被删节点
  return OK;
}

/***********************************
          释放节点
输入值:链表的指针,释放节点的位置
输出值:状态码
功能:   将已用节点释放成备用节点
 ***********************************/
Status freeNode(staticlink space,int target){
  space[target].cur = space[0].cur;        //释放节点连接第一备用节点
  space[0].cur = target;              //第一节点连接释放节点
  return OK;
}

/**********************************
          输出链表
输入值:链表的指针
输出值:状态码
功能:  将链表的值一一输出
 **********************************/
Status printLink(staticlink space){
  int mov = MAX-1;
  while(space[mov].cur){
    mov = space[mov].cur;
    printf("[%d] ",space[mov].data);
  }
  printf("\n");
  return OK;
}

int main(){
  int num,value,index;
  staticlink L;
  initLink(L);

  printf("[create]enter num:");
  scanf("%d",&num);
  createValue(L,num);
  printLink(L);

  printf("[insert]enter index:");
  scanf("%d",&index);
  printf("[insert]enter value:");
  scanf("%d",&value);
  insertNode(L,index,value);
  printLink(L);

  printf("[delete]enter index:");
  scanf("%d",&index);
  deleteNode(L,index);
  printLink(L);
  return 0;
}

运行效果:

时间: 2024-10-14 21:53:19

静态链表代码的相关文章

看数据结构写代码(5)静态链表

静态链表用于 不能使用 指针的 编程语言中. 下面奉上代码: // StaticLinkList.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdlib.h> //静态链表的 实现 typedef int Element; #define INIT_SIZE 10 //为了测试,故意将值设置的很小 enum E_STATE { E_STATE_ERROR = 0, E_STATE_OK = 1, }; str

数据结构之线性表代码实现顺序存储,链式存储,静态链表(选自大话数据结构)

一,线性表顺序存储 #include <stdio.h> #include <string.h> #include <ctype.h> #include <stdlib.h> #include <io.h> #include <math.h> #include <time.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSI

【数据结构】单链表&amp;&amp;静态链表详解和代码实例

喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 单链表(Singly Linked List ) 1.1 什么是单链表? 单链表是一种链式存储的结构.它动态的为节点分配存储单元.当有节点插入时,系统动态的为结点分配空间.在结点删除时,应该及时释放相应的存储单元,以防止内存泄露.由于是链式存储,所以操作单链表时,必须知道头结点或者头指针的位置.并且,在查找第i个节点时,必须找到第i-1个节点. 1.2 单链表的存储结构代码描述 对于链式存储,通过上一节的讲解相信大家已

静态链表、循环链表、双向链表(C代码实现)

静态链表 对于没有指针的编程语言,可以用数组替代指针,来描述链表.让数组的每个元素由data和cur两部分组成,其中cur相当于链表的next指针,这种用数组描述的链表叫做静态链表,这种描述方法叫做游标实现法.我们对数组的第一个和最后一个元素做特殊处理,不存数据.让数组的第一个元素cur存放第一个备用元素(第一个未被占用的元素)下标,而数组的最后一个元素cur存放第一个有值的元素下标,相当于头结点作用.空的静态链表如下图 当存放入一些数据时("甲""乙""

静态链表过程演示及代码实现(A - B) U (B - A)

静态链表说明 使用数组来实现链式存储结构,目的是方便在不设指针类型的高级程序设计语言中使用链式结构 c语言定义数据结构 #define MAX_SIZE 1000 // 所有的类型都统一定义为ElemType typedef int ElemType; typedef struct { ElemType data; int cur; } component, LinkList[MAX_SIZE]; 存储结构如下图所示 静态链表的工作原理 静态链表重点是在构建两个链表:备用链表(空闲的节点)和数据

第二章:3.线性表---静态链表的表示和实现

前言: 由于一些高级程序设计语言中,并没有 "指针" 类型,因此上一节中用指针来描述的单链表不能被实现,这时候我们就会使用另一种形式链表:静态链表. 目录: 1.线性表的链式表示和实现 1.1线性链表 单链表(指针型线性链表) 静态链表 1.2循环链表 1.3双向链表 正文: 线性表的静态单链表存储结构: #define MAXSIZE 100; //链表的最大长度 typedef   struct{ ElemType  data; int  cur; }component, SLin

能判断是否还有剩余空间的静态链表

第一次系统的学习数据结构是在半年前,看小甲鱼的数据结构与算法视频,自学的话有许多不懂得地方,什么AVL树,红黑树,图的最短路径,最小生成树...但总归对数据结构与算法有一个大体的印象,到现在随着不断写代码,做OJ题,愈发认识到数据结构与算法的重要性,打算再看一遍,现在看着:大话数据结构(程杰著),数据结构(C语言版严蔚敏著),不推荐新手使用 数据结构与算法分析(Mark Allen Weiss 著)这本书真的很难懂. 回归正题,我看了许多书有关静态链表的描述和代码发现都没有判断是否还有剩余空间,

静态链表 C语言描述

静态链表1.下标为0的游标存放最后存放数据节点的游标,即是第一个没有存放元素(备用链表)的下标2.最后一个的节点存放第一个由数值得下标3.第一个和最后一个都不存放数据 即是备用链表的第一个的下标 4.最后一个存储数据的节点的游标为0 静态链表主要是根据游标来遍历,以前没有指针用的思想 假如我要删除一个元素 图不多描述,自己画画就明白,然后代码部分.都有注释, 1 #include <stdio.h> 2 #define ElemType int 3 #define Status int 4 #

hdu3791静态链表解二叉搜索树

查看原题 题意 先给你一个数字n,接着是一串数字,你把它顺序扫描后建立一棵二叉搜索树.然后再陆续给你n串数字,判断它们尽力的二叉树和第一个二叉树是否相同. 题目保证给出的字符串长度不大于10.每个数字在0~9之间.且给出的数字不会有重复. 分析 很明显,这是一个数据结构的题目,很容易想到的就是直接自定义个二叉树结点的结构来做了.但是我感觉那样好麻烦,题目已经给出了数字长度不会大于10.所以直接用静态的链表也就是数组来解就可以了.要是数字的个数太多就不能这样做了.来看二叉树中结点与数组下标的对应关