1.基本概念
(1)线性表的逻辑定义
线性表是由n(n>=0)个数据元素(结点)a1,a2,…,an组成的有序列表。
线性表的逻辑结构特征(对于非空的线性表)如下:
①仅有一个开始结点a1,没有直接前趋,仅有一个直接后继a2;
②仅有一个终端结点an,没有直接后继,仅有一个直接前趋an-1;
③当其余的内部结点ai都有且仅有一个直接前趋和一个直接后继。
(2)顺序表的定义
顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
将表中元素一个接一个的存入一组连续的存储单元中,这种存储结构是顺序结构。
采用顺序存储结构的线性表简称为“ 顺序表”。顺序表的存储特点是:只要确定了起始位置,表中任一元素的地址都通过下列公式得到:LOC(ai)=LOC(a1)+(i-1)*L 1≤i≤n 其中,L是元素占用存储单元的长度。
顺序表的结构定义:
#define maxlen 50 //定义顺序表中元素个数最多有几个
typedef struct
{
elementtype data[maxlen]; //elementtype是元素的类型 依具体情况而定
int listlen; //便于时刻了解顺序表里元素的个数
}seqlist; //顺序表的名称 不妨为seqlist
声明顺序表类型变量:
seqlist L,L1;
如顺序表的每个结点占用len个内存单元,用location (ki)表示顺序表中第i个结点ki所占内存空间的第1个单元的地址。则有如下的关系:location (ki+1) = location (ki) +len
location (ki) = location(k1) + (i-1)len
存储结构要体现数据的逻辑结构,顺序表的存储结构中,内存中物理地址相邻的结点一定具有顺序表中的逻辑关系。
特点:
①存储结构
②固定大小
③访问速度快
④插入、删除操作效率低
⑤适合静态存储数据
2.线性表和顺序表的基本运算
(1)线性表的基本运算
①InitList(L):构造一个空的线性表L,即表的初始化。
②ListLength(L):求线性表L中的结点个数,即求表长。
③GetNode(L,I):取线性表L中的第i个结点,1<=i<=ListLength(L)。
④LocateNode(L,x):在L中查找值为x的结点,并返回x在L中的位置。若L中没结点的值为x.则返回一个特殊值表示查找失败。
⑤InsertList(L,x,i):在表L的第i个位置上插入 个值x的结点。
⑥DeleteList(L,i):删除线性表L的第i个结点。
(2)顺序表的基本运算
①创建:创建顺序表需要确定元素类型和表的大小。在内存中分配一段连续的空间,用来存储元素。创建顺序表的时间复杂度为0(1)。
②插入:插入操作是将一个元素插入到顺序表的指定位置。插入操作需要移动插入位置后面的元素,以腾出空间。如果插入位置在表尾,直接在表尾添加元素即可。插入操作的时间复杂度为O(n)。
③删除;删除操作是将顺序表中的一个元素删除。删除操作需要将删除位置后面的元素向前移动,以填补删除位置。如果删除位置在表尾,直接删除即可。删除操作的时间复杂度为O(n)。
④查找和遍历:查找操作是在顺序表中查找一个元素。顺序表可以通过下标直接访问元素,因此查找操作的时间复杂度为O(1)。如果要查找元素的位置,需要遍历整个顺序表,时间复杂度为O(n)。
3.顺序表的实现
(1)顺序表的定义
typedef struct list
{
int data[MAXSIZE]; /*存储空间,数组*/
int length; /*顺序表的长度*/
}SeqList;
(2) 顺序表的初始化
int init(SeqList *L)
{
L->length = 0;
return 0;
}
(3)插入元素
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;
}
插入元素时要看顺序表里还有没有位置能插入
(4)判断顺序表是否非空
int empty(SeqList *L)
{
return (L->length == 0)?1:0;
}
(5)判断顺序表是否为满
if(full(L))
{
printf("Error[10001],顺序表已满!\n");
return 10001;
}
(6)删除元素
int delete(SeqList *L, int i, DataType *x)
{
return 0;
}
(7) 输出顺序表
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");
}
4.完整的demo
#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(" 本程序为顺序表的演示程序,有张亚辉设计开发,程序完成了。。。。功能!。。。\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)
{
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");
}
/*
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[] = "\
/\ \
( *)======/\==== \
)( / \ \
__________/ ) / \ \
\___ / / \"\" \ \
\____ _/ / (**) \ \
/ \__/ (----------) \
/____|__//_ ( 送给您- ) \
| ( 亲爱的 ) \
| ( )\
| (____)\
_|__\
\\ ☆新年 . 快乐☆";
5.小结
线性表是最基本、最简单、也是最常用的一种数据结构。线性表是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。通过老师和同学的指导,初步了解了顺序表的概念知识和简单操作,也对c语言进行了简单的复习。
6.参考文献
(1)《数据结构(c语言版)》李刚 刘万辉
(2)百度百科
(3)CSDN各路大佬