吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1127|回复: 0
收起左侧

[求助] C 静态链表插入数据的游标值上的疑问

[复制链接]
ing 发表于 2019-12-30 11:16



为什么游标值一开始就是 6 而不是1?参数 array 是一个长度为7的结构体数组

捕获.PNG

结构体的配置
捕获6.PNG

初始化了一个长度为7的静态链表
捕获0.PNG


备用链表的创建
捕获7.PNG


完整代码
#include <stdio.h>
#include <stdlib.h>

#define maxSize 7

typedef struct
{
    char data;
    int cur;
}component;

int initArr(component *array);
//从备用链表上摘下空闲结点
int mallocArr(component *array);
//将 结构体数组 中所有分量连接到备用链表
void reserveArr(component *array);
void insertArr(component * array,int body,int add,char a);
void displayArr(component *array,int body);

int main()
{
    component array[maxSize];
    int body = initArr(array);
    printf("静态链表:\n");
    displayArr(array,body);

    printf("在位置2上插入结点 'd' \n");
    insertArr(array, body, 3, 'd');
    displayArr(array, body);

    return 0;
}

//创建备用链表
void reserveArr(component * array)
{
    //把每个数组分量连接在一起
    for (int i = 0; i < maxSize; ++i) {
        array.cur = i + 1;
    }
    //让最后一个结点的游标值为 0
    array[maxSize-1].cur = 0;
}

//提取 分配空间(游标的值)
int mallocArr(component *array)
{
    //返回不为 0 的节点下标;0 为假,if(0)不会执行,第一次执行返回 1
    int i = array[0].cur;
    if (array[0].cur)
    {
        //负责链表表头的游标值
        array[0].cur = array.cur;
    }
    return i;
}

//初始化静态链表
int initArr(component *array)
{
    reserveArr(array);
    //第一次执行 mallocArr(array) 得到 array[0]处游标值 1
    int body = mallocArr(array);
    //当作指针使用的变量,指向链表最后一个结点
    //链表为空时和 备用链表表头 重合{ ,1}
    int tempBody = body;
    //注意,在数组下标为 1 的位置开始赋值
    for (int i = 1; i < 5; ++i) {
        //从备用链表中拿出空闲的 分量
        //第二次执行 mallocArr(array) 得到 array[1]处游标值 2
        int j = mallocArr(array);
        array[j].data = i;
        array[tempBody].cur = j;
        //指向链表最后一个结点的指针后移
        tempBody = j;
    }
    //让最后一个结点的游标为0
    array[tempBody].cur = 0;
    return body;
}

//body表示链表的头结点在数组中的位置,add表示插入元素的位置,a表示要插入的数据
void insertArr(component * array,int body,int add,char a)
{
    int tempBody = body;
    //找到要插入的位置的上一个结点在数组中的位置
    //然后获取它的游标
    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;
}

void displayArr(component *array,int body)
{
    //tempBody 作遍历使用
    int tempBody = body;
    while (array[tempBody].cur)
    {
        printf("%c, %d \n",array[tempBody].data,array[tempBody].cur);
        tempBody = array[tempBody].cur;
    }
    printf("%c, %d \n",array[tempBody].data,array[tempBody].cur);
}


发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-27 00:27

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表