编辑代码

#include <stdio.h>
#define maxSize 6
typedef struct{
    int data;
    int cur;
}component;
//创建备用链表
void reserveArr(component *array){
    for(int i=0;i<maxSize;i++){
        array[i].cur = i+1;//将每个数组分量链接到一起
        array[i].data= -1;
    }
    array[maxSize-1].cur = 0;//链表最后一个结点的游标是0
}
//提取分配空间
int mallocArr(component * array){
    //若备用链表非空,则返回分配的结点下标,否则返回0
    int i = array[0].cur;
    if(array[0].cur){
        array[0].cur = array[i].cur;
    }
    return i;
}
//初始化静态链表
int initArr(component *array){
    reserveArr(array);
    int body = mallocArr(array);
    //声明一个变量,把它当指针使用,指向链表的最后一个结点,因为链表为空,
    //所以和头结点重合
    int tempBody = body;
    for(int i=0;i<4;i++){
        int j = mallocArr(array);//从备用链表中拿出空闲的分量
        array[tempBody].cur = j;
        array[j].data = i;
        tempBody =j;
    }
    array[tempBody].cur = 0;//新链表的最后一个结点的指针设置为0
    return body;
}
//打印链表
void displayArr(component * array,int body){
    int tempBody = body;
    while(array[tempBody].cur){
        printf("%d,%d ",array[tempBody].data,array[tempBody].cur);
        tempBody = array[tempBody].cur;
    }
    printf("%d,%d\n",array[tempBody].data,array[tempBody].cur);
}
//插入数据
void insertArr(component * array, int body, int add, int elem){
    int tempBody = body;//tempBody做遍历结构体数组使用
    //找到要插入位置的上一个结点在数组中的位置
    for(int i=1;i<add;i++){
        tempBody = array[tempBody].cur;
    }
    int insert = mallocArr(array);
    array[insert].data = elem;
    array[insert].cur = array[tempBody].cur;
    array[tempBody].cur = insert;
}
//备用链表回收空间
void freeArr(component * array,int k){
    array[k].cur = array[0].cur;
    array[0].cur = k;
}
//删除结点函数
void deleArr(component * array,int body,int elem){
    int tempBody = body;
    //找到被删除结点的位置
    while(array[tempBody].data!=elem){
        tempBody = array[tempBody].cur;
        //当tempBody为0时,表示链表遍历结束
        if(tempBody == 0){
            printf("链表中没有此数据");
            return;
        }
    }
    // 运行到此,证明有该结点
    int del = tempBody;
    tempBody = body;
    //找到该结点的上一个结点,做删除操作
    while(array[tempBody].cur!=del){
        tempBody = array[tempBody].cur;
    }
    //将被删除结点的游标直接给被删除结点的上一个节点
    array[tempBody].cur = array[del].cur;
    //回收被摘除节点的空间
    freeArr(array, del);
}
//链表查找数据
int selectElem(component * array, int body,int elem){
    int tempBody = body;
    //当游标值为0时,表示链表结束
    while(array[tempBody].cur!=0){
        if(array[tempBody].data == elem){
            return tempBody;
        }
        tempBody = array[tempBody].cur;
    }
    return -1;
}
//更改链表数据
void updateElem(component * array,int body, int oldElem, int newElem){
    int add = selectElem(array, body, oldElem);
    if(add == -1){
        printf("无更改元素");
        return;
    }
    array[add].data = newElem;
}
int main () {
    component array[maxSize];
    int body = initArr(array);
    printf("静态链表为:\n");
    displayArr(array,body);
    insertArr(array,body,3,6);
    displayArr(array,body);
    return 0;
}