1.顺序表的定义及特点
顺序表是一种线性表的存储结构,它通过采用动态一维数组来实现。顺序表的定义包括三个基本要素:指针域elem(指向顺序表的基地址)、length(顺序表长度)和listsize(顺序表当前分配的空间大小)。顺序表的特点是:元素之间在内存中的存储地址是连续的,可以通过下标直接访问元素,插入和删除操作需要移动元素的位置。
2.顺序表的运算(概述)
顺序表的运算包括但不限于以下几个方面:创建顺序表、插入元素、删除元素、查找元素、打印顺序表等。
顺序表的实现主要涉及创建顺序表、插入元素和打印顺序表三个操作。创建顺序表时,需要动态分配内存空间并将元素赋值给顺序表的elem域。插入元素时,需要将要插入位置后面的元素依次后移,并将新元素插入到指定位置。打印顺序表时,可以通过循环遍历顺序表的元素并输出。
3.顺序表的实现(详细的介绍及C程序代码、执行结果)如下所示:
顺序表的实现(详细的介绍及C程序代码、执行结果):
1. 定义顺序表的结构、表的长度以及数组
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 //定义顺序表的最大长度
typedef struct {
int *elem; //指针域,指向顺序表的基地址
int length; //顺序表长度
int listsize; //顺序表当前分配的空间大小
} SeqList;
2.顺序表初始化函数
void InitList(SeqList *L) {
L->elem = (int *)malloc(MAXSIZE * sizeof(int)); //动态分配内存空间
if (!L->elem) {
printf("分配内存空间失败!\n");
exit(1);
}
L->length = 0;
L->listsize = MAXSIZE;
}
3.定义插入顺序表中的函数
void InsertList(SeqList *L, int pos, int elem) {
if (pos < 1 || pos > L->length + 1) {
printf("插入位置不合法!\n");
return;
}
if (L->length >= L->listsize) {
printf("顺序表已满,无法插入!\n");
return;
}
for (int i = L->length - 1; i >= pos - 1; i--) {
L->elem[i + 1] = L->elem[i]; //元素后移
}
L->elem[pos - 1] = elem; //插入新元素
L->length++;
}
4.打印顺序表
void PrintList(SeqList L) {
printf("顺序表的存储空间大小为:%d.\n", L.listsize);
printf("顺序表中共有元素 %d 个,各个元素是:\n", L.length);
for (int i = 0; i < L.length; i++) {
printf("%d\t", L.elem[i]);
}
printf("\n");
}
5.主函数
int main() {
SeqList L;
InitList(&L);
int choice, position, element;
while (1) {
printf("\n************ 顺序表操作 ************\n");
printf("1. 插入元素\n");
printf("2. 打印顺序表\n");
printf("0. 退出\n");
printf("请输入您的选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入要插入的位置和元素值(以空格分隔):");
scanf("%d %d", &position, &element);
InsertList(&L, position, element);
printf("插入成功!\n");
break;
case 2:
PrintList(L);
break;
case 0:
printf("程序已退出。\n");
exit(0);
default:
printf("无效的选择!\n");
break;
}
}
return 0;
}
执行结果如下:
4.完整的Demo
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 //定义顺序表的最大长度
typedef struct {
int *elem; //指针域,指向顺序表的基地址
int length; //顺序表长度
int listsize; //顺序表当前分配的空间大小
} SeqList;
//初始化顺序表
void InitList(SeqList *L) {
L->elem = (int *)malloc(MAXSIZE * sizeof(int)); //动态分配内存空间
if (!L->elem) {
printf("分配内存空间失败!\n");
exit(1);
}
L->length = 0;
L->listsize = MAXSIZE;
}
//插入元素
void InsertList(SeqList *L, int pos, int elem) {
if (pos < 1 || pos > L->length + 1) {
printf("插入位置不合法!\n");
return;
}
if (L->length >= L->listsize) {
printf("顺序表已满,无法插入!\n");
return;
}
for (int i = L->length - 1; i >= pos - 1; i--) {
L->elem[i + 1] = L->elem[i]; //元素后移
}
L->elem[pos - 1] = elem; //插入新元素
L->length++;
}
//打印顺序表
void PrintList(SeqList L) {
printf("顺序表的存储空间大小为:%d.\n", L.listsize);
printf("顺序表中共有元素 %d 个,各个元素是:\n", L.length);
for (int i = 0; i < L.length; i++) {
printf("%d\t", L.elem[i]);
}
printf("\n");
}
int main() {
SeqList L;
InitList(&L);
int choice, position, element;
while (1) {
printf("\n************ 顺序表操作 ************\n");
printf("1. 插入元素\n");
printf("2. 打印顺序表\n");
printf("0. 退出\n");
printf("请输入您的选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入要插入的位置和元素值(以空格分隔):");
scanf("%d %d", &position, &element);
InsertList(&L, position, element);
printf("插入成功!\n");
break;
case 2:
PrintList(L);
break;
case 0:
printf("程序已退出。\n");
exit(0);
default:
printf("无效的选择!\n");
break;
}
}
return 0;
}
5.小结
通过本次作业,让我明白什么是顺序表及它的特点,还掌握了一些基本运算。我明白了这些结论:顺序表是一种常用的线性表存储结构,其特点是元素之间在内存中的存储地址是连续的,可以通过下标直接访问元素。顺序表的实现涉及创建、插入、删除、查找和打印等操作,通过动态一维数组来实现。
6.参考文献
1.李刚 刘王辉”数据结构(c语言)”
2.百度百科
3.CSDN有关数据结构的内容
4.ChatGPT4