线性表顺序存储中的问题

img

img


线性表顺序存储这样写,运行结果为什么显示表元素会是空的,代码哪里有问题

参考GPT和自己 的思路,在代码中,读取输入字符的语句使用了scanf("%c",&L->data[i]),但是输入时输入的字符带有回车符(\n),回车符也被读取到了字符数组中,导致读入字符的数目少于期望值。因此,输出时表中的元素都为空。

为解决这个问题,可以在读取字符前添加一个空格。

下面是BuildList函数修改后的代码:

void BuildList(SeqList *L)
{
    int i;
    printf("ÈôÄãÊäÈëµÄÊý¾ÝΪ'0'ʱ£¬Ôò½áÊøÊäÈë\n");
    for(i=0;i<100;i++)
    {
        printf("ÊäÈëÊý¾Ý:");
        scanf(" %c",&L->data[i]); // 在这里添加了一个空格
        if(L->data[i]=='0')
            break;
        L->last++;
    }
    if(i==99)
        printf("ÎÞ·¨¼ÌÐø´´½¨£¡\n");
    printf("*************´´½¨³É¹¦£¡*************\n");
}

希望能帮你解决问题,还请采纳!!!

代码直接贴出来吧,弄个动画更没法看

代码翻动太快了,看不清楚。在你输出数据的地方下断点调试下。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
可能出现表元素为空的情况有以下几种可能:

  1. 结构体类型未定义:在定义线性表类型的结构体中,可能没有定义数据元素的具体类型,导致无法存储数据。

  2. 存储空间分配错误:在创建线性表对象时,可能未正确分配存储空间,导致无法存储表元素。

  3. 数据写入错误:在使用代码向线性表中写入数据时,可能有错误,导致表元素为空。

下面是一个可能出现问题的顺序存储代码示例:

#include <stdio.h>  
#include <stdlib.h>  
  
#define MaxSize 100  
  
//定义线性表结构体  
struct LinearList  
{  
    int data[MaxSize];  
    int length;  
};  
  
// 初始化线性表  
void InitList(struct LinearList *L)  
{  
    L->length = 0;  
}  
  
// 插入元素  
void ListInsert(struct LinearList *L, int i, int x)  
{  
    int j;  
    if (L->length == MaxSize) //线性表已经满了,无法插入  
        return;  
    if (i < 1 || i > L->length + 1) //i值不合法  
        return;  
    for (j = L->length; j >= i; j--)  //将i及其之后的元素后移  
    {  
        L->data[j] = L->data[j - 1];  
    }  
    L->data[i - 1] = x;     //新元素插入  
    L->length++;            //表长增1  
}  
  
void main()  
{  
    struct LinearList *L;  
    L->length = 0;   //初始化线性表  
    ListInsert(L, 1, 5);   //插入一个元素  
    for (int i = 0; i < L->length; i++)   //遍历元素  
    {  
        printf("%d", L->data[i]);  //输出元素值  
    }  
}    

这段代码的错误在于定义了一个指向结构体的指针 L,但是没为其分配内存空间。 在使用 ListInsert 函数插入元素时,由于没有为 L 分配内存空间,导致错误出现在插入元素前。

正确的代码应该为:

#include <stdio.h>  
#include <stdlib.h>  
  
#define MaxSize 100  
  
//定义线性表结构体  
struct LinearList  
{  
    int data[MaxSize];  
    int length;  
};  
  
// 初始化线性表  
void InitList(struct LinearList *L)  
{  
    L->length = 0;  
}  
  
// 插入元素  
void ListInsert(struct LinearList *L, int i, int x)  
{  
    int j;  
    if (L->length == MaxSize) //线性表已经满了,无法插入  
        return;  
    if (i < 1 || i > L->length + 1) //i值不合法  
        return;  
    for (j = L->length; j >= i; j--)  //将i及其之后的元素后移  
    {  
        L->data[j] = L->data[j - 1];  
    }  
    L->data[i - 1] = x;     //新元素插入  
    L->length++;            //表长增1  
}  
  
int main()  
{  
    struct LinearList L;  
    InitList(&L);   //初始化线性表  
    ListInsert(&L, 1, 5);   //插入一个元素  
    for (int i = 0; i < L.length; i++)   //遍历元素  
    {  
        printf("%d", L.data[i]);  //输出元素值  
    }  
    return 0;    
}    

在上述代码中,L 被定义为一个线性表结构体而不是指向结构体的指针,并且在使用 ListInsert 函数和 InitList 函数时,使用了取地址符(&)对其进行了参数传递。
如果我的回答解决了您的问题,请采纳!

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^