• 静态链表代码


     早期的编程语言不像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("
    ");
      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;
    }

     运行效果:

  • 相关阅读:
    唤醒控件曾经拥有的能力(重新继承是可以使用的.)
    为ASP.NET MVC应用程序创建更复杂的数据模型
    Akka入门实例
    最火的.NET开源项目(转)
    Roslyn 编译平台概述
    C#开发157
    ASP.NET MVC学习之控制器篇
    AngularJS中数据双向绑定(two-way data-binding)
    订单系统中并发问题和锁机制的探讨
    Visual Studio 编辑器
  • 原文地址:https://www.cnblogs.com/demonxian3/p/7112577.html
Copyright © 2020-2023  润新知