3、静态链表

1、静态链表初始化

head指向-1代表当前为空链表,pool指向下一个可用空间(在数组下标为2的空间),2指向3,3指向4,最后的指向0表示没有下一个节点,以此链接起来。

2、实现代码

#include<stdio.h>
#include<malloc.h>

#define MAX_SIZE 20

typedef char ElemType;

typedef struct StaticList{
    ElemType data;
    int      next;    
}StaticList;


void initSList(StaticList* sList){
    int i = 0;
    //将数组链接起来 
    for(i;i < MAX_SIZE - 1;i++){
        sList[i].next = i + 1;
    }
    //数组下标为0的元素代表头结点
    //头结点指向-1代表后面没有元素,即为空链表 
    sList[0].next = -1;
    //指向 0 表示后续没有其他可用空间 
    sList[MAX_SIZE - 1].next = 0;
    
}

//获取数组下一个可用位置下标 
int malloc_node(StaticList* sList){
    //拿到数组中可用空间的下标 
    int pos = sList[1].next;
    
    if(sList[pos].next != 0){
        //说明当前数组还有未使用空间 
        //指向下一个未使用空间的下标 
        sList[1].next = sList[pos].next;
    }
    return pos;
}

//头插法 
void insert_head(StaticList* sList,ElemType e){ 
    //获取数组可用空间的元素下标 
    int i = malloc_node(sList);
    if(i == 0){
        printf("空间不足,申请节点空间失败.\n");
        return;
    }
    sList[i].data = e;
    if(sList[0].next == -1){
        //说明当前插入的是第一个元素 
        sList[i].next = -1;
    }else{
        //说明不是第一个元素,采用头插法插入 
        sList[i].next = sList[0].next;
    }
    //头节点指向插入的节点下标 
    sList[0].next = i;
    
}

//释放节点
void free_node(StaticList* sList,int pos){
    //重新链接数组 
    sList[pos].next = sList[1].next;
    //下标为 pos 的节点成为下一个可用空间 
    sList[1].next = pos;
} 

//删除头部
void delete_head(StaticList* sList){
    //获取第一个节点下标 
    int i = sList[0].next;
    if(i == -1){
        printf("当前链表为空,不可删除.\n");
        return;
    }
    //将第一个元素指向下一个元素下标给到头节点 
    sList[0].next = sList[i].next;
    //重新链接数组 
//    sList[i].next = sList[1].next;
    //删除的节点成为下一个可用空间 
//    sList[1].next = i; 
    free_node(sList,i);
} 

//打印链表 
void show_SList(StaticList* sList){
    int i = sList[0].next;
    while(i != -1){
        printf("%c->",sList[i].data);
        i = sList[i].next;
    }
    printf("NULL .\n");
}
int main(){
    StaticList staticList[MAX_SIZE];
    initSList(staticList);
    int i = 0;
    for(i;i <= 5;i++){
        insert_head(staticList,'a'+i);
    }
    show_SList(staticList);
    delete_head(staticList);
    show_SList(staticList);
    return 0;
}

 

 

posted @ 2024-09-13 13:37  颜欢兮  阅读(24)  评论(0)    收藏  举报