1、顺序表的定义
要理解何为顺序表,先要知道什么是线性表
线性表:具有相同数据类型的 n (n>0)个数据元素的有限序列
线性表三大特点:
- 存在唯一的首元素(表头元素)和尾元素(表尾元素)
- 除第一个元素外,每个元素有且仅有一个直接前驱
- 除最后一个个元素外,每个元素有且仅有一个直接后继
顺序表的概念:顺序表是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使的逻辑上相邻的两个元素在物理位置上也相邻。
2、顺序表的特点
- 表中元素的逻辑顺序与物理顺序相同。
- 随机访问,即通过首地址和元素序号可在时间O(1)内找到指定的元素。
- 存储密度高,每个节点只存储数据元素。
- 逻辑上相邻的元素物理上也相邻,所以插入和删除操作需要移动大量元素。
3、顺序表的运算
- 插入:在顺序表的指定位置插入一个元素,将插入位置后的元素依次向后移动来实现。
- 删除:从顺序表中删除指定位置的元素,将删除位置后的元素依次向前移动来实现。
- 查找:在顺序表中查找指定元素的位置,使用线性搜索或二分搜索等算法来实现。
- 更新:修改顺序表中指定位置的元素的值。
- 求长度:计算顺序表中元素的个数。
4、顺序表的实现
4.1顺序表的初始化
/*顺序表初始化*/
int init(SeqList *L)
{
L->length = 0;
return 0;
}
4.2顺序表的长度
/*顺序表的长度*/
int length(SeqList *L)
{
return L->length;
}
4.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;
}
/*移动元素,向后移动*/
for(j=L->length;j>=i;j--)
{
L->data[j] = L->data[j-1];
}
L->data[j] = x;
L->length++;
return 0; /*ok!*/
}
4.4删除元素
/*删除元素*/
int delete(SeqList *L, int i, DataType *x)
{
int k;
if(i<1||i>=L->length+1){ //如果删除位置不合法,则无法删除
printf("Error[1003],删除位置i不合法\n");
return 10003; /*返回10003表示位置不合法*/
}
for(k=i-1;k<L->length-1;k++){
L->data[k]=L->data[k+1];
}
L->length--;
return 0;
}
4.5输出顺序表
/*输出顺序表*/
void print(SeqList *L)
{
int i;
if(empty(L))
{
printf("顺序表为空!\n");
return 0 ;
}
printf("顺序表为:");
for(i=0;i<L->length;i++)
{
printf(" %d ", L->data[i]);
}
printf("\n");
}
4.6查找元素
/*查找元素*/
int find(SeqList *L,int x)
{
int i;
for (i=0;i<L->length;i++){
if (L->data[i]==x){
printf("元素【%d】在表中第【%d】个位置\n",x,i+1);
}
}
}
5.完整代码
5.1(主函数)main.c
#include <stdio.h>
#include "SeqList.h"
#include "welcome.h"
#include<string.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<1000;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("7. 查找元素\n");
printf("8. 帮助\n");
printf("0. 退出\n");
printf("请输入您要进行的操作(1~8,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(i):");
scanf("%d",&i);
if(!delete(&L,i,&x)){
printf("位置【%d】上的元素已经删除\n",i, x);
}
break;
case 4:
if(empty(&L))
{
printf("顺序表为空\n");
}
else
{
printf("顺序表不为空!\n");
}
break;
case 5:
if(full(&L))
{
printf("顺序表已满!\n");
}
else
{
printf("顺序表未满!\n");
}
break;
case 6:
print(&L);
break;
case 7:
printf("请输入你要查找的元素x:");
scanf("%d",&x);
find(&L,x,i);
break;
case 8:
printf(" 本程序为顺序表的演示程序,有HQ设计开发,程序实现了对顺序表插入删除查找等功能!\n");
break;
}
}while(cmd != 0);
return 0;
}
5.2 SeqList.c(函数实现)
/*
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)
{
int k;
if(i<1||i>=L->length+1){ //如果删除位置不合法,则无法删除
printf("Error[1003],删除位置i不合法\n");
return 10003; /*返回10003表示位置不合法*/
}
for(k=i-1;k<L->length-1;k++){
L->data[k]=L->data[k+1];
}
L->length--;
return 0;
}
/*输出顺序表*/
void print(SeqList *L)
{
int i;
if(empty(L))
{
printf("顺序表为空!\n");
return 0 ;
}
printf("顺序表为:");
for(i=0;i<L->length;i++)
{
printf(" %d ", L->data[i]);
}
printf("\n");
}
/*查找元素*/
int find(SeqList *L,int x)
{
int i;
for (i=0;i<L->length;i++){
if (L->data[i]==x){
printf("元素【%d】在表中第【%d】个位置\n",x,i+1);
}
}
}
5.3SeqList.h(函数声明)
/*
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);
/*查找元素*/
int find(SeqList *L, int i, DataType x);
5.4welcome.h
char welcome[]=(
" lovelove lovelove\n"
" lovelovelove lovelovelove\n"
" lovelovelovelove lovelovelovelove\n"
" lovelovelovelovelove lovelovelovelovelove\n"
" lovelovelovelovelovelo lovelovelovelovelovelo\n"
" loveloveloveloveloveloveFFlovelovelovelovelovelov\n"
" loveloveloveloveloveloFFFFFlovelovelovelovelovelo\n"
" loveloveloveloveloveFFFFFFlovelovelovelovelove\n"
" lovelovelovelovecscscsdcJJJlovelovelovelove\n"
" lovelovelovelovelovelovelovlovelovelove\n"
" lovelovelovelbfbhngovelovellovecdvd\n"
" lovelovelovelovelovelovecsdcdsds\n"
" lovelovelovelovelovelscsdcs\n"
" lovelovelovelovelovelov\n"
" lovelovelovelovelo\n"
" lovelovelovelo\n"
" lovelovelo\n"
" lovelov\n"
" love\n"
" 爱\n"
);
6.运行结果截图
7.小结
顺序表是一种线性数据结构,其特点在于元素之间的逻辑关系是线性的,且元素在物理存储上是连续的。顺序表通常使用数组来实现,这使得顺序表在访问元素时具有很高的效率。然而,这种数据结构也有一些局限性,比如在插入和删除元素时可能需要移动大量的元素。
顺序表是一种线性数据结构,其特点在于元素之间的逻辑关系是线性的,且元素在物理存储上是连续的。顺序表通常使用数组来实现,这使得顺序表在访问元素时具有很高的效率。然而,这种数据结构也有一些局限性,比如在插入和删除元素时可能需要移动大量的元素。
8.参考文献
- 数据结构c语言版本(李刚)
- 百度查询
- csdn博客