c语言动态非递减有序顺序表输入元素,插入元素使代码仍递增
时间: 2023-05-30 19:05:39 浏览: 100
已知单链表L为按值递增有序的,编写算法将数据元素e插入到顺序表L中,使之仍有序
5星 · 资源好评率100%
下面是一个实现动态非递减有序顺序表输入元素,并插入元素使代码仍递增的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int *data;
int length;
int capacity;
} SeqList;
void initList(SeqList *list, int capacity) {
list->data = (int *)malloc(sizeof(int) * capacity);
list->length = 0;
list->capacity = capacity;
}
void destroyList(SeqList *list) {
free(list->data);
list->data = NULL;
list->length = list->capacity = 0;
}
void displayList(SeqList list) {
for (int i = 0; i < list.length; i++) {
printf("%d ", list.data[i]);
}
printf("\n");
}
void insert(SeqList *list, int value) {
if (list->length == list->capacity) {
int *newData = (int *)realloc(list->data, sizeof(int) * (list->capacity * 2));
if (newData == NULL) {
printf("Memory allocation failed.\n");
return;
}
list->data = newData;
list->capacity *= 2;
}
int i = list->length - 1;
while (i >= 0 && list->data[i] > value) {
list->data[i + 1] = list->data[i];
i--;
}
list->data[i + 1] = value;
list->length++;
}
int main() {
SeqList list;
int capacity = 5;
initList(&list, capacity);
int value;
printf("Please input the elements of the list (non-negative integers, -1 to end):\n");
do {
scanf("%d", &value);
if (value >= 0) {
insert(&list, value);
displayList(list);
}
} while (value != -1);
destroyList(&list);
return 0;
}
```
该代码中的 `insert()` 函数实现了将元素按非递减有序插入到顺序表中的功能。具体的实现方法是,从顺序表的末尾开始向前遍历,如果当前元素比待插入元素大,则将当前元素后移一位,直到找到一个比待插入元素小或相等的元素,然后将待插入元素插入到该位置后面。由于顺序表是非递减有序的,因此当遍历到的元素比待插入元素小时,就可以结束遍历了,因为后面的元素都比待插入元素大。
在主函数中,先通过 `initList()` 函数初始化一个容量为 5 的顺序表。然后通过 `insert()` 函数将用户输入的元素插入到顺序表中,并输出当前的顺序表。当用户输入 -1 时,退出输入循环,通过 `destroyList()` 函数销毁顺序表并释放内存。
阅读全文