-
在此先声明:
-
j+1
是一个表达式,表示将j
的值加上 1,但不会修改j
的值本身。如果您在代码中使用j+1
,它会计算j+1
的值,但不会改变j
的值。 -
j += 1
是一个赋值表达式,表示将j
的值增加 1,并将结果赋值给j
。这样,j
的值会被修改为新的值(即原来的值加上 1)。#include <stdio.h> #include <stdlib.h> // 包含 stdlib.h 以使用 malloc #define initsize 10 typedef int ElemType; // 顺序表中元素的类型,这里假设为 int,您可以根据需要更改 typedef struct { ElemType *data; // 数据指针 int maxsize, length; // 最大容量和当前长度 } SeqList; // 初始化顺序表 void InitList(SeqList &L) { L.data = (ElemType *)malloc(initsize * sizeof(ElemType)); // 为数据分配初始空间 L.length = 0; // 设置当前长度为0 L.maxsize = initsize; // 设置最大容量为初始容量 } // 在顺序表的第 i 个位置插入元素 e bool ListInsert(SeqList &L, int i, ElemType e) { // 判断插入位置是否合法 if (i < 1 || i > L.length + 1) return false; // 判断顺序表是否已满 if (L.length >= L.maxsize) return false; // 将第 i 个位置及其后面的元素依次后移一位 for (int j = L.length; j >= i; j--) { L.data[j] = L.data[j - 1]; } // 在第 i 个位置插入元素 e L.data[i - 1] = e; // 更新顺序表的长度 L.length++; return true; } // 删除顺序表的第 i 个位置的元素,并将删除的元素保存到 e 中 bool ListDelete(SeqList &L, int i, ElemType &e) { // 判断删除位置是否合法 if (i < 1 || i > L.length) return false; // 将第 i 个位置的元素保存到 e 中 e = L.data[i - 1]; // 将第 i 个位置及其后面的元素依次前移一位 for (int j = i; j < L.length; j++) { L.data[j - 1] = L.data[j]; } // 更新顺序表的长度 L.length -= 1; return true; } int main() { SeqList L; // 声明顺序表变量 InitList(L); // 初始化顺序表 if (ListInsert(L, 1, 2)) { // 在第一个位置插入元素 2 printf("Insert successful!\n"); } else { printf("Insert failed!\n"); } // 打印顺序表中的元素 for (int i = 0; i < L.length; i++) { printf("%d ", L.data[i]); } printf("\n"); // 测试删除第 1个位置的元素 ElemType deletedElement; if (ListDelete(L, 1, deletedElement)) { printf("Delete successful! Deleted element: %d\n", deletedElement); } else { printf("Delete failed!\n"); } return 0; }
这段代码是创建线性表,初始化线性表以及对表进行输入,打印,输出但是在运行之后反回的值是错误
-
-
这是因为i和j有错误
- 在
ListInsert
函数中,for
循环的递减条件应该是j -= 1
而不是j-1
。 - 在
ListInsert
函数中,插入元素时应该将L.data[j-1]
赋值给L.data[j]
,而不是将L.data[i-1]
赋值给L.data[j]
。插入元素的位置应该是i-1
而不是i
。 - 在
ListDelete
函数中,for
循环的递增条件应该是j += 1
而不是j+1
。 - 在
ListDelete
函数中,删除元素时应该将L.data[j]
赋值给L.data[j-1]
,而不是将L.data[j-1]
赋值给L.data[j]
。另外,减少顺序表长度应该是L.length -= 1
而不是L.length-1
#include <stdio.h> #include <stdlib.h> // 包含 stdlib.h 以使用 malloc #define initsize 10 typedef int ElemType; // 顺序表中元素的类型,这里假设为 int,您可以根据需要更改 typedef struct { ElemType *data; // 数据指针 int maxsize, length; // 最大容量和当前长度 } SeqList; void InitList(SeqList &L) { L.data = (ElemType *)malloc(initsize * sizeof(ElemType)); // 注意这里使用的是 initsize L.length = 0; L.maxsize = initsize; // 注意这里使用的是 initsize } bool ListInsert(SeqList &L, int i, ElemType e) { if (i < 1 || i > L.length + 1) return false; if (L.length >= L.maxsize) return false; for (int j = L.length; j >= i; j -= 1) { L.data[j] = L.data[j - 1]; } L.data[i - 1] = e; L.length++; return true; } bool ListDelete(SeqList &L, int i, ElemType &e) { if (i < 1 || i > L.length) return false; e = L.data[i - 1]; for (int j = i; j < L.length; j += 1) { L.data[j - 1] = L.data[j]; } L.length -= 1; return true; } int main() { SeqList L; // 声明顺序表变量 InitList(L); // 调用初始化函数,注意这里函数名大小写应一致 if (ListInsert(L, 1, 2)) { printf("Insert successful!\n"); } else { printf("Insert failed!\n"); } for (int i = 0; i < L.length; i++) { printf("%d ", L.data[i]); } printf("\n"); // 测试删除第 1 个位置的元素 ElemType deletedElement; if (ListDelete(L, 1, deletedElement)) { printf("Delete successful! Deleted element: %d\n", deletedElement); } else { printf("Delete failed!\n"); } return 0; }
更改之后打印正确
所以要注意表之间和就所对应的位置。