07_静态链表

一、什么是静态链表?
静态链表:分配一整片连续的内存空间,各个节点集中安置
二、定义静态链表的结构体?
typedef struct node{
    ElemType data;
    int cur; //游标:指向下一个”节点“
}Node,StaticList[MAXSIZE];
三、操作函数
1、必备函数
(1)判断链表是否为空

(2)求链表长度

(3)判断addr是否在区间中

(4)删除一个节点

(5)插入一个节点

(6)抽取一个节点

(7)定位到addr的前一个节点
//1、判断链表是否为空
bool isEmpty(Node * list, int addr){ //如果addr=0,就是判断备用链表是否为空;任何addr=1,就是判断数据链表是否为空
    if (list[addr].cur == 0){
        printf("Spare list is empty!\n");
        return true; //为空
    }
    return false; //不为空
}
// 2、求链表长度
int length_list(Node * list){

    int cur = list[1].cur;
    int length = 0;
    for (int i = 0; i < MAXSIZE; ++i) {
        if (cur == 0 && i == 1){
            return length;
        } else if (cur == 0){
            return length;
        }
        length++;
        cur = list[cur].cur;
    }
}
// 3、判断addr是否在区间中
bool isBetween(Node * list, int addr){

    if (addr<0 || addr>length_list(list)){
        printf("Addr is not in the list!\n");
        return false; //不在区间中
    }

    return true; //在区间中
}
//4、删除一个节点
void delete_node(Node * list, int addr1, int delete_addr2){
    list[addr1].cur = list[delete_addr2].cur;
}

//5、插入一个节点
void insert_node(Node * list, int addr1, int insert_addr2){
    list[insert_addr2].cur = list[addr1].cur;
    list[addr1].cur = insert_addr2;
}
//6、抽取一个节点
int allocation_node(Node * list){
    int addr = list[0].cur;

    delete_node(list,0,addr);

    return addr;
}
//7、定位到addr的前一个节点
int location_addr(Node * list, int addr){
    int cur = 1;
    for (int i = 1; i < addr; ++i) {
        cur = list[cur].cur;
    }
    return cur;
}

2、基础函数
(1)初始化链表

(2)插入元素

(3)遍历元素

(4)删除元素

(5)查找元素
// 1、初始化静态链表
void init_list(Node * list){
    for (int i = 0; i < sizeof(StaticList)/sizeof(Node); ++i) {
        list[i].data = 0;
        if (i == MAXSIZE-1){
            list[i].cur = 0;
        } else if (i == 0){
            list[i].cur = i+2;
        }else if (i == 1){
            list[i].cur = 0;
        } else{
            list[i].cur = i+1;
        }
    }
}
//2、插入元素
Status insert_elem(Node * list, int addr, ElemType elem){

    // 1、判断
    if (isEmpty(list,0))
        return Error;
    if (addr<0 || addr>length_list(list)+1){
        printf("Addr is not int the list!\n");
        return Error;
    }

    //2、插入一个元素
        int al_addr = allocation_node(list); //从备用链表获取空间
        list[al_addr].data = elem;
        int lo_addr = location_addr(list,addr);
        insert_node(list,lo_addr,al_addr);

    return Ok;
}
//3、遍历元素
Status traverse_list(Node * list){
    int cur = list[1].cur;
    for (int i = 0; i < MAXSIZE; ++i) {
        if (cur == 0)
            return Error;
        printf("%-4d",list[cur].data);
        cur = list[cur].cur;
    }
    return Ok;
}
//4、删除元素
Status delete_elem(Node * list, int addr){

    //1 判断
    if (isEmpty(list,1))
        return Error;
    if (!isBetween(list,addr))
        return Error;

    //2 删除节点
    int lo_addr = location_addr(list,addr); //定位到前一个节点
    int after_adr = list[lo_addr].cur;
    list[after_adr].data = 0;
    delete_node(list,lo_addr,after_adr);
    insert_node(list,0,after_adr);

    return Ok;
}
//5、查询元素
int return_addr(Node * list, ElemType elem){

    //1 判断
    if (isEmpty(list,1))
        return Error;

    //2 定位
    int addr = 0;
    int cur = 1;
    for (int i = 0; i < MAXSIZE; ++i) {

        if (cur == 0){
            printf("The element is not in the list!\n");
            return Error;
        }

        if (list[cur].data == elem)
            return addr;

        addr++;

        cur = list[cur].cur;
    }

}
注意:初始化静态链表
        需要两条链表,一条备用链表,一条数据链表
            A、备用链表:连接 没有存放任何元素的节点 的链表,通常以下标[0]为头节点
            B、数据链表:连接 存放数据元素的的节点 的链表,通常以下标[1]为头节点
            
            注意:头节点是恒定不变的,不会进行任何操作
四、总结
1、理解静态链表的存储结构
2、掌握所有的操作函数
3、复习main函数和其他函数中的参数以及变量的生命周期
五、代码
// Created by hanfei on 2021/5/5.
// 静态链表
#include "stdio.h"
#include "stdlib.h"
#include "stdbool.h"

#define ElemType int
#define Status int
#define Error 0
#define Ok 1
#define MAXSIZE 10

typedef struct node{
    ElemType data;
    int cur; //游标:指向下一个”节点“
}Node,StaticList[MAXSIZE];


/************************必备函数************************/

//1、判断链表是否为空
bool isEmpty(Node * list, int addr){ //如果addr=0,就是判断备用链表是否为空;任何addr=1,就是判断数据链表是否为空
    if (list[addr].cur == 0){
        printf("Spare list is empty!\n");
        return true; //为空
    }
    return false; //不为空
}

// 2、求链表长度
int length_list(Node * list){

    int cur = list[1].cur;
    int length = 0;
    for (int i = 0; i < MAXSIZE; ++i) {
        if (cur == 0 && i == 1){
            return length;
        } else if (cur == 0){
            return length;
        }
        length++;
        cur = list[cur].cur;
    }
}

// 3、判断addr是否在区间中
bool isBetween(Node * list, int addr){

    if (addr<0 || addr>length_list(list)){
        printf("Addr is not in the list!\n");
        return false; //不在区间中
    }

    return true; //在区间中
}

//4、删除一个节点
void delete_node(Node * list, int addr1, int delete_addr2){
    list[addr1].cur = list[delete_addr2].cur;
}

//5、插入一个节点
void insert_node(Node * list, int addr1, int insert_addr2){
    list[insert_addr2].cur = list[addr1].cur;
    list[addr1].cur = insert_addr2;
}

//6、抽取一个节点
int allocation_node(Node * list){
    int addr = list[0].cur;

    delete_node(list,0,addr);

    return addr;
}

//7、定位到addr的前一个节点
int location_addr(Node * list, int addr){
    int cur = 1;
    for (int i = 1; i < addr; ++i) {
        cur = list[cur].cur;
    }
    return cur;
}

/************************基础函数************************/

// 1、初始化静态链表
void init_list(Node * list){
    for (int i = 0; i < sizeof(StaticList)/sizeof(Node); ++i) {
        list[i].data = 0;
        if (i == MAXSIZE-1){
            list[i].cur = 0;
        } else if (i == 0){
            list[i].cur = i+2;
        }else if (i == 1){
            list[i].cur = 0;
        } else{
            list[i].cur = i+1;
        }
    }
}

//2、插入元素
Status insert_elem(Node * list, int addr, ElemType elem){

    // 1、判断
    if (isEmpty(list,0))
        return Error;
    if (addr<0 || addr>length_list(list)+1){
        printf("Addr is not int the list!\n");
        return Error;
    }

    //2、插入一个元素
        int al_addr = allocation_node(list); //从备用链表获取空间
        list[al_addr].data = elem;
        int lo_addr = location_addr(list,addr);
        insert_node(list,lo_addr,al_addr);

    return Ok;
}

//3、遍历元素
Status traverse_list(Node * list){
    int cur = list[1].cur;
    for (int i = 0; i < MAXSIZE; ++i) {
        if (cur == 0)
            return Error;
        printf("%-4d",list[cur].data);
        cur = list[cur].cur;
    }
    return Ok;
}

//4、删除元素
Status delete_elem(Node * list, int addr){

    //1 判断
    if (isEmpty(list,1))
        return Error;
    if (!isBetween(list,addr))
        return Error;

    //2 删除节点
    int lo_addr = location_addr(list,addr); //定位到前一个节点
    int after_adr = list[lo_addr].cur;
    list[after_adr].data = 0;
    delete_node(list,lo_addr,after_adr);
    insert_node(list,0,after_adr);

    return Ok;
}

//5、查询元素
int return_addr(Node * list, ElemType elem){

    //1 判断
    if (isEmpty(list,1))
        return Error;

    //2 定位
    int addr = 0;
    int cur = 1;
    for (int i = 0; i < MAXSIZE; ++i) {

        if (cur == 0){
            printf("The element is not in the list!\n");
            return Error;
        }

        if (list[cur].data == elem)
            return addr;

        addr++;

        cur = list[cur].cur;
    }

}

int main(void){

    StaticList list;
    init_list(list);
    insert_elem(list,1,1);
    insert_elem(list,2,2);
    insert_elem(list,3,3);
//    printf("\nlength = %d\n",length_list(list));
//    delete_elem(list,3);
//    printf("\nlength = %d\n",length_list(list));
//    delete_elem(list,2);
//    printf("\nlength = %d\n",length_list(list));
//    delete_elem(list,1);
//    traverse_list(list);
//    printf("\nlength = %d\n",length_list(list));
    printf("%d\n",return_addr(list,1));
    for (int i = 0; i < MAXSIZE; ++i) {
        printf("[%d] data=%d cur=%d\n",i,list[i].data,list[i].cur);
    }

   /* list[1].cur = 2;
    list[2].cur = 1;
    printf("%d\n",length_list(list));
    isBetween(list,2);*/
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_43876924

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值