接下来我将详细讲解 C 语言动态顺序表的实现过程。首先我们需要先了解顺序表的概念,顺序表是一种线性表的存储结构,它在物理上采用一组连续的内存空间来存储线性表的数据元素,并且对于顺序表的元素,我们可以按照元素下标进行随机存取。接下来我们就可以开始进行动态顺序表的实现了。
动态顺序表的实现
初步设计
首先我们需要先建立一个动态顺序表结构体,它包含了以下几个基本成员变量:
typedef struct {
int *elem; // 存储空间的基地址
int length; // 当前顺序表的长度
int capacity; // 顺序表的初始容量
} SeqList;
我们可以使用 malloc()
函数在内存中申请空间,对应到模拟该数据结构中,初始化时需分配初始空间。在动态顺序表中,我们需要提供插入、删除、查找等操作,下面是对应的函数实现:
插入元素
bool insert(SeqList *L, int index, int value) {
// 首先需要判断插入位置的合法性
if (index < 1 || index > L->length + 1) {
return false;
}
// 需要判断顺序表是否已满
if (L->length >= L->capacity) {
// 如果已满,需要进行扩容
int *new_base = (int *)realloc(L->elem,
(L->capacity + LIST_INCREMENT) * sizeof(int));
// 判断是否分配成功
if (!new_base) {
return false;
}
// 修改当前顺序表的存储基址和容量
L->elem = new_base;
L->capacity += LIST_INCREMENT;
}
// 进行元素插入,需要从后往前依次将元素后移
for (int i = L->length; i >= index; i--) {
L->elem[i] = L->elem[i - 1];
}
L->elem[index - 1] = value;
// 插入成功后需要将顺序表长度加一
L->length++;
return true;
}
删除元素
bool delete(SeqList *L, int index) {
// 首先需要判断删除位置的合法性
if (index < 1 || index > L->length) {
return false;
}
// 进行元素删除,需要从该位置开始将元素依次向前移动
for (int i = index; i < L->length; i++) {
L->elem[i - 1] = L->elem[i];
}
// 删除后需要将顺序表长度减一
L->length--;
return true;
}
查找元素
int search(SeqList *L, int value) {
for (int i = 0; i < L->length; i++) {
if (L->elem[i] == value) {
// 找到后返回该元素在顺序表中的位置
return i + 1;
}
}
// 找不到返回 -1
return -1;
}
示例说明
下面提供两个示例来说明动态顺序表的使用。
示例一:对一个用户输入的数组建立一个动态顺序表
#include <stdio.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 100
#define LIST_INCREMENT 10
typedef struct {
int *elem;
int length;
int capacity;
} SeqList;
bool insert(SeqList *L, int index, int value) {
// 首先需要判断插入位置的合法性
if (index < 1 || index > L->length + 1) {
return false;
}
// 需要判断顺序表是否已满
if (L->length >= L->capacity) {
// 如果已满,需要进行扩容
int *new_base = (int *)realloc(L->elem,
(L->capacity + LIST_INCREMENT) * sizeof(int));
// 判断是否分配成功
if (!new_base) {
return false;
}
// 修改当前顺序表的存储基址和容量
L->elem = new_base;
L->capacity += LIST_INCREMENT;
}
// 进行元素插入,需要从后往前依次将元素后移
for (int i = L->length; i >= index; i--) {
L->elem[i] = L->elem[i - 1];
}
L->elem[index - 1] = value;
// 插入成功后需要将顺序表长度加一
L->length++;
return true;
}
bool delete(SeqList *L, int index) {
// 首先需要判断删除位置的合法性
if (index < 1 || index > L->length) {
return false;
}
// 进行元素删除,需要从该位置开始将元素依次向前移动
for (int i = index; i < L->length; i++) {
L->elem[i - 1] = L->elem[i];
}
// 删除后需要将顺序表长度减一
L->length--;
return true;
}
int search(SeqList *L, int value) {
for (int i = 0; i < L->length; i++) {
if (L->elem[i] == value) {
// 找到后返回该元素在顺序表中的位置
return i + 1;
}
}
// 找不到返回 -1
return -1;
}
int main() {
int n, temp;
SeqList list;
list.elem = (int *)malloc(LIST_INIT_SIZE * sizeof(int));
list.capacity = LIST_INIT_SIZE;
list.length = 0;
printf("请输入数组长度n:");
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
printf("请输入第%d个元素:", i);
scanf("%d", &temp);
insert(&list, i, temp);
}
printf("当前顺序表中的元素为:");
for (int i = 0; i < list.length; i++) {
printf("%d ", list.elem[i]);
}
printf("\n");
return 0;
}
运行效果如下:
请输入数组长度n:5
请输入第1个元素:1
请输入第2个元素:3
请输入第3个元素:5
请输入第4个元素:7
请输入第5个元素:9
当前顺序表中的元素为:1 3 5 7 9
示例二:使用动态顺序表实现一个小游戏
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define LIST_INIT_SIZE 100
#define LIST_INCREMENT 10
typedef struct {
int *elem;
int length;
int capacity;
} SeqList;
bool insert(SeqList *L, int index, int value) {
// 首先需要判断插入位置的合法性
if (index < 1 || index > L->length + 1) {
return false;
}
// 需要判断顺序表是否已满
if (L->length >= L->capacity) {
// 如果已满,需要进行扩容
int *new_base = (int *)realloc(L->elem,
(L->capacity + LIST_INCREMENT) * sizeof(int));
// 判断是否分配成功
if (!new_base) {
return false;
}
// 修改当前顺序表的存储基址和容量
L->elem = new_base;
L->capacity += LIST_INCREMENT;
}
// 进行元素插入,需要从后往前依次将元素后移
for (int i = L->length; i >= index; i--) {
L->elem[i] = L->elem[i - 1];
}
L->elem[index - 1] = value;
// 插入成功后需要将顺序表长度加一
L->length++;
return true;
}
bool delete(SeqList *L, int index) {
// 首先需要判断删除位置的合法性
if (index < 1 || index > L->length) {
return false;
}
// 进行元素删除,需要从该位置开始将元素依次向前移动
for (int i = index; i < L->length; i++) {
L->elem[i - 1] = L->elem[i];
}
// 删除后需要将顺序表长度减一
L->length--;
return true;
}
int search(SeqList *L, int value) {
for (int i = 0; i < L->length; i++) {
if (L->elem[i] == value) {
// 找到后返回该元素在顺序表中的位置
return i + 1;
}
}
// 找不到返回 -1
return -1;
}
bool playGame(SeqList *L) {
printf("游戏开始!\n");
int count = 0;
// 随机选择一个数
srand((unsigned)time(NULL));
int target = rand() % 1000 + 1;
while (1) {
int guess;
printf("请输入您猜测的数字:");
scanf("%d", &guess);
count++;
if (search(L, guess) != -1) {
printf("您已经猜测过这个数字,请重新输入。\n");
} else {
if (guess < target) {
printf("您输入的数字小了,请再次猜测!\n");
insert(L, L->length + 1, guess);
} else if (guess > target) {
printf("您输入的数字大了,请再次猜测!\n");
insert(L, L->length + 1, guess);
} else {
printf("恭喜您猜对了!您一共猜了%d次。\n", count);
return true;
}
}
}
}
int main() {
SeqList list;
list.elem = (int *)malloc(LIST_INIT_SIZE * sizeof(int));
list.capacity = LIST_INIT_SIZE;
list.length = 0;
playGame(&list);
free(list.elem);
return 0;
}
运行效果如下:
游戏开始!
请输入您猜测的数字:500
您输入的数字小了,请再次猜测!
请输入您猜测的数字:750
您输入的数字小了,请再次猜测!
请输入您猜测的数字:875
您输入的数字小了,请再次猜测!
请输入您猜测的数字:937
您输入的数字大了,请再次猜测!
请输入您猜测的数字:906
恭喜您猜对了!您一共猜了5次。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言动态顺序表实例代码 - Python技术站