目录
1. 顺序表的定义及其特点;
定义:顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
特点:连续存储:顺序表使用数组来存储元素,数组中的元素在内存中是连续存储的。
随机访问:由于元素在内存中连续存储,可以通过下标直接访问任意位置的元素,具有快速的随机访问能力。
插入和删除的复杂度较高:在顺序表中插入和删除元素时,需要移动其他元素以保持顺序,因此插入和删除的时间复杂度较高。
固定长度:顺序表的长度是固定的,需要预先分配足够的内存空间来存储元素。
2. 顺序表的运算(概述);
初始化:创建一个空的顺序表。
- 插入元素:在指定位置插入一个新元素。
- 删除元素:删除指定位置的元素。
- 输出顺序表:依次访问顺序表中的所有元素。
- 判断顺序表是否满:查询顺序表的长度是否等于设定的最长度
- 判断顺序表是否为空:查询顺序表的长度是否为0。
3. 顺序表的实现(详细的介绍及C程序代码、执行结果);
1.初始化代码
int init(SeqList *L)
{
L->length = 0;
return 0;
}
2.插入元素
int insert(SeqList *L, int i, DataType x)
{
int j;
/*判断是否满*/
if(full(L))
{
printf("Error[10001],顺序表已满!\n");
return 10001;
}
/*判断位置i合法性*/
if(i<1 || i>length(L)+1)
{
printf("Error[10002],位置i不合法!\n");
return 10002;
}
/*移动元素,向后移动*/
for(j=L->length;j>=i;j--)
{
L->data[j] = L->data[j-1];
}
L->data[j] = x;
L->length++;
return 0; /*ok!*/
}
3.删除元素
/*删除元素*/
int delete(SeqList *L, int i, DataType *x) {
if (i < 1 || i > L->length) {
// 越界检查,判断是否给定的位置 i 合法
return 0; // 删除失败,返回0
}
*x = L->data[i - 1];
for (int j = i; j < L->length; j++) {
L->data[j - 1] = L->data[j];
}
L->length--;
return 1; // 删除成功,返回1
}
4.输出序列表
/*输出顺序表*/
void print(SeqList *L)
{
int i;
if(empty(L))
{
printf("顺序表为空!");
return ;
}
printf("顺序表为:");
for(i=0;i<L->length;i++)
{
printf(" %d ", L->data[i]);
}
printf("\n");
}
5.判断顺序表是否满
*顺序表是否满*/
int full(SeqList *L)
{
return (L->length == MAXSIZE)?1:0;
}
6.判断顺序表是否为空
/*是否空*/
int empty(SeqList *L)
{
return (L->length == 0)?1:0;
}
执行结果:
初始化
插入元素
删除元素
输出序列表
判断序列表是否满
判断序列表是否为空
4. 完整的Demo;
#include <stdio.h>
#include <strings.h>
#include "SeqList.c"
#include "welcome.h"
int main(int argc, char *argv[]) {
SeqList L;
int cmd;
int i;
int m, n;
DataType x;
for (i = 0; i < strlen(welcome); i++) {
printf("%c", welcome[i]);
for (m = 0; m < 10000; m++)
for (n = 0; n < 1000; n++) { ;
}
}
printf("\n\n\n");
printf("-----------顺序表演示程序----------\n");
do {
printf("1. 初始化顺序表\n");
printf("2. 插入元素\n");
printf("3. 删除元素\n");
printf("4. 判断顺序表是否为空\n");
printf("5. 判断顺序表是否满\n");
printf("6. 输出顺序表\n");
printf("10. 帮助\n");
printf("0. 退出\n");
printf("请输入您要进行的操作(1~6,0退出):");
scanf("%d", &cmd);
switch (cmd) {
case 1:
if (!init(&L)) {
printf("顺序表已初始化!\n");
}
break;
case 2:
printf("请输入位置i,插入元素x(i,x):");
scanf("%d,%d", &i, &x);
if (!insert(&L, i, x)) {
printf("元素(%d)已插入位置[%d]\n", x, i);
}
break;
case 3:
printf("请输入要删除的位置i:");
scanf("%d", &i);
if (delete(&L, i, &x)) {
printf("删除成功,被删除的元素为:%d\n", x);
} else {
printf("删除失败,位置[%d]不合法\n", i);
}
break;
case 4:
if (empty(&L)) {
printf("顺序表为空!\n");
} else {
printf("顺序表不为空!\n");
}
break;
case 5:
if (full(&L)) {
printf("顺序表已满!\n");
} else {
printf("顺序表未满!\n");
}
case 6:
print(&L);
break;
case 10:
printf(" 本程序为顺序表的演示程序,有XXX设计开发,程序完成了。。。。功能!。。。\n");
break;
}
} while (cmd != 0);
return 0;
}
/*
SeqList.c 顺序表实现
*/
#include "SeqList.h"
/*顺序表初始化*/
int init(SeqList *L)
{
L->length = 0;
return 0;
}
/*顺序表的长度*/
int length(SeqList *L)
{
return L->length;
}
/*顺序表是否满*/
int full(SeqList *L)
{
return (L->length == MAXSIZE)?1:0;
}
/*是否空*/
int empty(SeqList *L)
{
return (L->length == 0)?1:0;
}
/*插入元素*/
int insert(SeqList *L, int i, DataType x)
{
int j;
/*判断是否满*/
if(full(L))
{
printf("Error[10001],顺序表已满!\n");
return 10001;
}
/*判断位置i合法性*/
if(i<1 || i>length(L)+1)
{
printf("Error[10002],位置i不合法!\n");
return 10002;
}
/*移动元素,向后移动*/
for(j=L->length;j>=i;j--)
{
L->data[j] = L->data[j-1];
}
L->data[j] = x;
L->length++;
return 0; /*ok!*/
}
/*删除元素*/
int delete(SeqList *L, int i, DataType *x) {
if (i < 1 || i > L->length) {
// 越界检查,判断是否给定的位置 i 合法
return 0; // 删除失败,返回0
}
*x = L->data[i - 1];
for (int j = i; j < L->length; j++) {
L->data[j - 1] = L->data[j];
}
L->length--;
return 1; // 删除成功,返回1
}
/*输出顺序表*/
void print(SeqList *L)
{
int i;
if(empty(L))
{
printf("顺序表为空!");
return ;
}
printf("顺序表为:");
for(i=0;i<L->length;i++)
{
printf(" %d ", L->data[i]);
}
printf("\n");
}
/*
SeqList.h 顺序表定义
*/
#define MAXSIZE 1000
typedef int DataType;
/*顺序表*/
typedef struct
{
DataType data[MAXSIZE];
int length;
}SeqList;
/*顺序表初始化*/
int init(SeqList *L);
/*顺序表的长度*/
int length(SeqList *L);
/*顺序表是否满*/
int full(SeqList *L);
/*是否空*/
int empty(SeqList *L);
/*插入元素*/
int insert(SeqList *L, int i, DataType x);
/*删除元素*/
int delete(SeqList *L, int i, DataType *x);
/*输出顺序表*/
void print(SeqList *L);
char welcome[] = "shgnvvj";
5. 小结;
顺序表是一种基于数组实现的线性表数据结构,具有快速的随机访问能力。它适用于需要频繁随机访问元素的场景,但插入和删除操作的效率相对较低。
6. 参考文献
《数据结构(C语言板)》--- 李刚 刘万辉