咨询链表问题:为什么这个链表的元素长度是-1的?

mian.c:

/**
 * 测试为顺序链表测试。
 *
 */

#include <stdio.h>
#include "dataElement.h"
#include "ListTable/SequenceList.h"

ElementType dataArray[] = {
        {0, "goodman"},
        {1, "goodsun"},
        {2, "goodday"},
        {3, "goodaby"},
        {4, "gooddog"}
//        {6, "goodcat"}
};
void TestPo();

int main() {
    TestPo();
    return 0;
}

void TestPo(){
    SeqList seqList;
    InitList(&seqList, dataArray, 6);
    //sizeof(dataArray)/sizeof(dataArray[0])
    PrintList(&seqList);
}

SequenceList.h:

//
// Created by adiao on 2022/9/18.
//

#ifndef CLISTPROJECT_SEQUENCELIST_H
#define CLISTPROJECT_SEQUENCELIST_H
#include "../dataElement.h"
#include <stdio.h>
#include <stdlib.h>

/** 初始化链表
 * @param seqList 要出初始化的顺序表
 * @param elemArray 初始化时要添加的元素内容数组
 * @param length 初始化时添加的元素个数
 *
 */
//初始化顺序表的抽象类型
void InitList(SeqList * seqList, ElementType * elemArray, int length);

/** 初始化链表
 * @param seqList 要插入的顺序表
 * @param index 通过下标确定位置
 * @param element 要插入的元素
 *
 */
//通过下标来添加参数
void InsertElement(SeqList * seqList, int index, ElementType element);

void PrintList(SeqList * seqList);




#endif //CLISTPROJECT_SEQUENCELIST_H

dataElement.h:

//
// Created by adiao on 2022/9/18.
//

#ifndef CLISTPROJECT_DATAELEMENT_H
#define CLISTPROJECT_DATAELEMENT_H


#define MAX_SIZE 255

/*
用来定义数据元素
*/

// typedef int ElementType;

typedef struct
{
    int id;
    char * name;
}ElementType;


// 定义顺序表结构
typedef struct{
    //顺序表中的数据元素集合
    ElementType datas[MAX_SIZE];
    //顺序表中的元素个数
    int length;
}SeqList;

#endif //CLISTPROJECT_DATAELEMENT_H

ListTable.c:

//
// Created by adiao on 2022/9/18.
//
//
// Created by adiao on 2022/9/18.
//

#include "SequenceList.h"

/** 初始化链表
 * @param seqList 要出初始化的顺序表
 * @param elemArray 初始化时要添加的元素内容数组
 * @param length 初始化时添加的元素个数
 *
 */
//初始化顺序表的抽象类型
void InitList(SeqList * seqList, ElementType * elemArray, int length)
{
    if (length > MAX_SIZE)
    {
        /* code */
        printf("超出了数组的最大容量,初始化失败");
        return;
    }
    seqList->length = 0;
    for ( int i =0; i < length - 1; i++)
    {
        /* code */
        InsertElement(seqList, i, elemArray[i]);
    }

}

/** 初始化链表
 * @param seqList 要插入的顺序表
 * @param index 通过下标确定位置
 * @param element 要插入的元素
 *
 */
//通过下标来添加参数
void InsertElement(SeqList * seqList, int index, ElementType element){
    //1、验证插入后的元素空间是否查过限定值
    //2、index的值是否合法。【0,限定值-1】
    //3、插入的index应该在length之内。
    //4、从第length-1个下标开始,前面一个元素赋值给后面一个元素
    if (seqList->length+1 >= MAX_SIZE)
    {
        /* code */
        printf("数组已满,插入失败\n");
    }
    if (index < 0 || index > MAX_SIZE - 1)
    {
        /* code */
        printf("只能在允许的下标范围内插入元素【0,%d\n", MAX_SIZE - 1);
    }
    if (index > seqList->length)
    {
        /* code */
        printf("插入的下标超过了数组的最大长度-1,插入失败\n");
    }

    //在C89标准版中不允许在for中直接定义变量。
    for (int i = seqList->length - 1; i >= index; i--){
        /* code */
        seqList->datas[i+1] = seqList->datas[i];
    }
    //5、将要插入的值赋值给第index个元素
    seqList -> datas[index] = element;
    //6、顺序链表的总长度+1!!!
    seqList -> length++;
}
void PrintList(SeqList * seqList){

    for (int i = 0; i < seqList->length; i++)
    {
        /* code */
        printf("%d\t%s\n", seqList->datas[i].id, seqList->datas[i].name);
    }
}

结果:

为什么会这样?按理说不是在InsitList函数中加入一个5的长度就可以将自己定义好的数组内容给打印出来么?

为啥要6个长度?

c
139 views
Comments
登录后评论
Sign In