建立一个顺序表,在顺序存贮结构上实现增加、删除、修改等基本操作,建立含n个数据元素的顺序表L并输出该表中各元素的值及顺序表的长度。然后在第i个位置插入、删除、修改某元素X,注意如何取到第i个元素,在插入过程中注意溢出情况以及数组的下标与位序(顺序表中元素的次序)的区别。
时间: 2024-10-08 17:16:35 浏览: 33
在C语言中,我们可以使用数组来创建一个简单的顺序表(也称为动态数组)。这里我们将定义一个结构体表示表中的元素,同时提供增加、删除和修改元素的方法,以及计算表长度的功能。为了处理插入过程中的溢出,我们需要确保有足够的空间,并正确更新索引。
首先,我们定义一个结构体`Element`:
```c
typedef struct {
int value;
int index; // 用于记录元素的位置
} Element;
```
接下来,创建顺序表的函数:
```c
// 初始化顺序表
void createSequenceList(Element** list, int n) {
*list = (Element*)malloc(n * sizeof(Element));
for (int i = 0; i < n; i++) {
(*list)[i].value = -1; // 初始值设置为-1
(*list)[i].index = i;
}
}
// 获取表长
int sequenceListLength(const Element* list) {
return list ? list->index + 1 : 0;
}
// 增加元素
void insertAt(Element** list, int i, int x) {
if (i >= sequenceListLength(*list)) {
printf("Error: Insertion position out of bounds.\n");
return;
}
int newSize = sequenceListLength(*list);
Element* newList = realloc(*list, (newSize + 1) * sizeof(Element));
if (!newList) {
printf("Memory allocation failed.\n");
return;
}
newList[i].value = x;
newList[i].index = i;
// 将原数组的数据移动到新分配的空间
memmove(&newList[i + 1], &newList[i], sizeof(Element) * (newSize - i));
*list = newList;
}
// 删除元素
void deleteFrom(Element** list, int i) {
if (i >= sequenceListLength(*list)) {
printf("Error: Deletion position out of bounds.\n");
return;
}
int newSize = sequenceListLength(*list) - 1;
if (newSize != 0) {
memmove(&(*list)[i], &(*list)[i + 1], sizeof(Element) * newSize);
} else {
free(*list); // 如果只剩下最后一个元素,释放内存
*list = NULL;
}
}
// 修改元素
void modifyIn(Element** list, int i, int x) {
if (i >= sequenceListLength(*list)) {
printf("Error: Modification position out of bounds.\n");
return;
}
(*list)[i].value = x;
}
// 输出列表内容和长度
void printList(const Element* list, int length) {
for (int i = 0; i < length; i++) {
printf("%d (at position %d)\t", list[i].value, list[i].index);
}
printf("\nLength: %d\n", length);
}
```
现在你可以根据这些函数创建、操作顺序表并打印结果。注意,每次操作后记得检查是否有溢出或内存分配失败的情况。
阅读全文