我创建了以下结构:
typedef struct {
char name[15];
int ID;
} Employee;
typedef Employee Item;
typedef struct {
Item items[5];
int size;
} List;
我从使用此函数填充这些字段的文件中获取值:
void Insert (Item I, int position, List *L){
int i, LastPos;
LastPos = Length(L)-1;
if((LastPos) >= position){
for(i = 0; i < (LastPos - position); i++){
L->items[i-(LastPos+1)] = L->items[LastPos-i];
}
}
L->items[position] = I;
L->size = L->size+1;
}
当位置变量不同时(即,尚未放置的变量),则没有问题,我能够打印出保存的值 EG:
在位置 0 处插入姓名 Stacy ID 1928502
在位置 1 处插入姓名 Jimmy ID 1290589
当我为他们的姓名和身份证号调用打印功能时,他们打印出来很好。
但是,如果我在位置 0 插入 Jimmy,他的信息会被打印出来,但是,每次 EG:ID 变为 32767 时,Stacy 的信息都会显示为随机内存位置。为什么当我覆盖已经存在的位置时会发生这种情况即使我有一个循环应该重新分配覆盖信息的位置(列表中的一个空格)。
最佳答案
让我们检查一下这个表达式:
L->items[i-(LastPos+1)]
如果 Length()
返回 2
(数组中当前的项目数),那么 LastPos + 1
应该是 2
。现在当循环开始时,i
是 0
,这意味着 i - (LastPost + 1)
等于 0 - 2
即 -2
。不是您通常在数组中使用的索引。
我建议你反过来,从最后一项循环到第一项:
for (int i = Length(L) - 1; i >= position; --i)
L->items[i + 1] = L->items[i];
关于c - 在静态列表 C 中的值之间插入节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18996727/