数据结构-------静态链表的创建

#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(当分配最后一个结点时,该结点的游标值为 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=1;i<4;i++){
        int j=mallocArr(array);   //从备用链表中拿出空闲的分量
        array[tempBody].cur=j;    //将申请的空闲分量链接在链表的最后一个结点后面
        array[j].data=i;          //给新申请的分量的数据域初始化
        tempBody=j;               //将指向链表最后一个结点的指针后移
    }

    array[tempBody].cur=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,char a)
{
    int tempBody=body;//tempBody 做遍历结构体数组使用

    //找到要插入位置的上一个结点在数组中的位置
    for(int i=1;i<add;i++)
    {
        tempBody=array[tempBody].cur;
    }
    int insert=mallocArr(array);//申请空间,准备插入
    array[insert].data=a;
    array[insert].cur=array[tempBody].cur;
    array[tempBody].cur=insert;

}
//备用链表回收空间的函数,其中 array 为存储数据的数组,k 表示未使用节点所在数组的下标
void freeArr(component *array,int k)
{
    array[k].cur=array[0].cur;
    array[0].cur=k;
}
//删除结点函数,a 表示被删除结点中数据域存放的数据
void deletArr(component *array,int body,char a)
{
    int tempBody=body;
    //找到被删除结点的位置
    while(array[tempBody].data!=a)
    {
        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);


}
//在以 body 作为头结点的链表中查找数据域为 elem 的结点在数组中的位置
int selectElem(component *array,int body,char elem)
{
    int tempBody=body;
    int a;
   do{
        if(array[tempBody].data==elem)
        {
            printf(".......111");
          return tempBody;
        }
        tempBody=array[tempBody].cur;
    }
    while(array[tempBody-1].cur!=0);

    return -1;

    
}

//改
void amendElem(component *array,int body,char oldElem.char newElem){
    int add=selectElem(array,body,lodElem);
    if(add==-1)
    {
        printf("无更改元素");
        return;
    }
    array[add].data=newElem;
}
int main()
{
    component array[maxSize];
    int body=initArr(array);
    //insertArr(array, body,4,5);
  //   insertArr(array, body,4,4);
    //deletArr(array, body,3);
    //deletArr(array, body,2);
    int a=selectElem(array, body,2);
  //  printf("body=%d:\n",body);
    printf("查找的位置在%d:\n",a);
    printf("静态链表为:\n");
    displayArr(array, body);
    return 0;

}


运行结果:root@book-virtual-machine:/mnt/hgfs/lua/C++# gcc  salman_0119.cpp -o salman_0119
root@book-virtual-machine:/mnt/hgfs/lua/C++# ./salman_0119
静态链表为:
-1,2 1,3 2,4 3,0
root@book-virtual-machine:/mnt/hgfs/lua/C++#

猜你喜欢

转载自blog.csdn.net/aa804738534/article/details/113650599