目录
1. 环境配置
2. 顺序表的定义及其特点;
3. 顺序表的运算(概述);
4. 顺序表的实现(详细的介绍及C程序代码、执行结果);
5. 完整的Demo;
6. 小结;
7. 参考文献
一 环境配置
vscode+MinWG/vc++6.0
二 顺序表的定义及其特点
定义:
将表中元素一个接一个的存入一组连续的存储单元中,这种存储结构是顺序结构。采用顺序存储结构的线性表简称为“ 顺序表”
注:
{采用顺序存储结构的线性表简称为“ 顺序表”。顺序表的存储特点是:只要确定了起始位置,表中任一元素的地址都通过下列公式得到:LOC(ai)=LOC(a1)+(i-1)*L 【1≤i≤n】 其中,L是元素占用存储单元的长度}
特点:
1.存储结构 (顺序表的存储结构是一段连续的内存空间,数据元素按照线性顺序存储,可以通过元素下标进行访问。)
2.固定大小 (顺序表的大小是固定的,一旦创建后就不能动态扩容或缩小,因此需要事先确定存储元素的个数)
3.访问速度快(由于顺序表的元素存储在连续的内存空间中,因此可以通过下标直接访问元素,访问速度较快。)
4.插入,删除操作效率低(由于顺序表的存储结构是连续的,因此在插入或删除元素时,需要将后续的元素全部向后或向前,移动效率较低)
5.适合静态存储数据(由于顺序表的大小是固定的,因此适合存储静态数据,不适合动态增删的情况)
三:顺序表的运算
顺序表是一种线性数据结构,可以进行多种运算操作。以下是基本的顺序表运算:
- 插入操作
- 删除操作
- 查找操作
- 更新操作
- 求长度操作
内容分析:
定义顺序表结构体
typedef struct
{
int length;//当前顺序表长度
int Maxsize;//顺序表最大长度
int* data;//定义顺序表中元素类型的数组指针
}SqList;
顺序表数据添加
顺序表搭建好了,之后往表上填数据。往顺序表-添加数据首先当然要判断一下表是否已满。如果表没有满,就往表中添加数据并且表的长度+1
#include<stdio.h>
#include<stdlib.h>
#define InitSize 10
void InitList(SqList &L)
{
L.data = (int *)malloc(InitSize*sizeof(int));//用malloc函数申请一片空间
L.length = 0;//把顺序表的当前长度设为0
L.Maxsize = InitSize;//这是顺序表的最大长度
}
顺序表操作
以上是顺序表的建立以及顺序表表尾添加数据的操作
以下是顺序表的操作:增,删,改,查
插入数据:
元素插入有一些要求:
1.元素是插队到奇怪的位置
2.顺序表存储空间是否满了(
数据插入(按位置查找)有三种情况:
1.表的开始插入
2.表的中间插入、
3.表的结尾插入
void IncreaseSize(SqList &L)
{
int len;
int *p = L.data;//*p指向的地址和顺序表的首地址是一样的
printf("请输入你要增加的顺序表的长度:");
scanf("%d", &len);
L.data = (int *)malloc((L.Maxsize + len)*sizeof(int));//新申请一片空间
for (int i = 0; i < L.length; i++)
L.data[i] = p[i];//把值一个个复制过去
L.Maxsize = L.Maxsize + len;//顺序表最大长度增加len
free(p);//释放空间
}
删除元素 :
元素删除有一些要求:
1.元素是否为表中的元素
2.顺序表存储空间是否为空
bool ListDelete(SqList &L)
{
int i, e;
printf("请输入要删除的元素位置:");
scanf("%d",&i);
if (i<1 || i>L.length + 1)//判断元素下标是否越界
return false;
if (!L.data)//判断是不是空表
{
printf("空表\n");
return false;
}
e = L.data[i - 1];
for (int j = i; j <= L.length; j++)
{
L.data[j-1] = L.data[j];
}
L.length--;//表长-1
printf("删除的元素是%d,这个元素的位置是%d\n", e, i);
return true;
}
更新元素:
顺序表更改元素的要求:
- 找到目标元素
- 直接修改该元素的值
void UpdateListElement(SeqList *L, int pos, int new_val) {
if (pos < 0 || pos >= L->length) {
printf("Error: Invalid position\n");
return;
}
L->data[pos] = new_val;
}
查找元素 :
顺序表的元素查找(按值查找)
顺序表按值查找,只能采用依次遍历的方法
void LocateElem(SqList &L)
{
int e;
int k = 1;
printf("输入你要查找的元素:");
scanf("%d", &e);
for (int i = 0; i < L.length; i++)
if (L.data[i] == e)
{
printf("找到了,是第%d个元素\n", i + 1);
k = 0;
break;
}
if (k)
printf("找不到元素%d\n", e);
}
数据打印
bool PrintList(SqList &L)
{
if (!L.data)//判断是不是空表
return false;
printf("顺序表里的元素有:");
for (int i = 0; i < L.length; i++)
printf("%d ", L.data[i]);
printf("\n");
return true;
}
4. 顺序表的实现(详细的介绍及C程序代码、执行结果);
顺序表功能
顺序表的插入
顺序表的删除
顺序表的修改
顺序表的查找
5.完整的DEMO
完整的Demo
#include <stdio.h>
#define MAXSIZE 1000
/*顺序表的定义*/
typedef struct list
{
int data[MAXSIZE]; /*存储空间,数组*/
int length; /*顺序表的长度*/
}SeqList;
int main(int argc, char* argv[])
{
SeqList L; /* 声明了一个顺序表L */
int i, j, k;
int x;
/*初始化*/
L.length = 0;
printf("顺序表L初始化完成。\n");
printf("1. 插入5个元素\n");
/*插入一些元素, 采用尾插法,新插入元素放在最后*/
for(i=0;i<5;i++)
{
printf("\t[%d].", i+1);
scanf("%d", &x);
/*尾插法*/
L.data[L.length] = x;
L.length++;
}
printf("输出顺序表L\n");
for(i=0;i<L.length;i++)
{
printf("L(%d) = %d\n", i+1, L.data[i]);
}
printf("2. 在指定位置插入元素x\n");
printf("请输入位置k:");
scanf("%d", &k);
printf("请输入元素x:");
scanf("%d", &x);
printf("正在检查位置k合法性...\n");
if(k<1 || k>L.length+1)
{
printf("位置k不合法!\n");
return 0;
}
printf("位置k检查结束,插入元素【%d】...\n", x);
j=0;
for(i=L.length;i>=k;i--)
{
j++;
L.data[i] = L.data[i-1];
}
printf(" 移动元素%d个\n", j);
L.data[i] = x;
L.length++;
printf("输出新的顺序表L\n");
for(i=0;i<L.length;i++)
{
printf("L(%d) = %d\n", i+1, L.data[i]);
}
printf("删除顺序表L第k个元素\n");
printf("请输入位置k:");
scanf("%d", &k);
printf("正在检查位置k合法性...\n");
if(k<1 || k>L.length)
{
printf("位置k不合法!\n");
return 0;
}
printf("位置k检查结束,开始删除...\n");
/*移动元素*/
for(i=k;i<L.length;i++)
{
L.data[i-1] = L.data[i];
}
L.length--;
printf("输出新的顺序表L\n");
for(i=0;i<L.length;i++)
{
printf("L(%d) = %d\n", i+1, L.data[i]);
}
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)
{
return 0;
}
/*输出顺序表*/
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");
}
#include <stdio.h>
#include "SeqList.h"
#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 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;
}
6. 小结;
关于这个阶段的学习,初步的了解了关于顺序表的概念性知识点一些事实性的操作。
除了这些之外也在复习了之前学的c语言内容,在以后的数据结构方面要下很多功夫。
7. 参考文献
1.百度百科
2.数据结构(C语言板)李刚 刘万辉
3.CSDN有关数据结构的内容