目录

一、顺序表的定义及其特点

二、顺序表的运算

三、顺序表的实现 

1、顺序表的创建

2、顺序表初始化

3、顺序表的插入

4、顺序表的删除

5、顺序表的查找

6、顺序表的输出

四、完整Demo

五、小结

六、参考文献 


一、顺序表的定义及其特点

定义顺序表是一种线性表的存储结构,它用一组地址连续的存储单位依次存储线性表中的数据元素。从而使得逻辑上相邻的两个元素在物理位置上也相邻。

特点:

  1. 顺序表具有动态分配空间、支持随机访问和顺序访问,逻辑顺序与物理顺序一致。
  2. 每个元素可以都有唯一的位置,可以通过索引直接访问元素。
  3. 元素可以是任意类型,包括基本数据类型、结构体等。

二、顺序表的运算

        顺序表的运算主要包括初始化、插入、删除和查找等操作。其中初始化是指将顺序表中所有元素都赋值为0或者空字符;插入操作需要将新元素插到指定位置,同时更新新顺序表的长度;删除操作需要将元素从顺序表中移除,并更新顺序表长度;查找操作需要在顺序表中查找一个元素,并返回其位置或未找到的表中。


三、顺序表的实现 

1、顺序表的创建

  • 顺序表可分为静态和动态顺序表两种。以下所用为静态顺序表需要确定最大长度,易导致空间资源不足或浪费。具体实现如下:
typedef struct     /*定义顺序表的数据结构*/
{
	DataType data[MAXSIZE];	/*存储空间,数组*/
	int length;			/*顺序表的当前长度*/
}SeqList;    /*顺序表的结构体类型*/

2、顺序表初始化

  • 只需要将存储空间的大小设置为初始值0即可。具体实现如下:
/*顺序表初始化*/
int init(SeqList *L)
{
	L->length = 0;    // 初始时,顺序表长度为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;
	}

	/*移动元素,向后移动*/
	for(j=L->length;j>=i;j--) // 将插入位置后的元素依次后移一位
	{
		L->data[j] = L->data[j-1];
	}
	L->data[j] = x;     // 在指定位置插入元素
	L->length++; // 顺序表长度加1
	return 0; /*ok!*/
}

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; 
	} 
	
	//将删除位置后的元素依次前移一位
	for(k=i-1;k<L->length-1;k++){
		L->data[k]=L->data[k+1];
		 
	} 
	//顺序表长度减一
	L->length--;
	return 0; 
}

5、 顺序表的查找

  • 在顺序表中查找一个元素,需要从头开始遍历顺序表,直到找到指定目标或者遍历完整个顺序表。具体实现如下:
// 查找顺序表中是否存在指定元素,如果存在则返回其位置,否则返回-1
int find(SeqList *L, int x) {
    for (int i = 0; i < L->length; i++) {
        if (L->data[i] == x) {    //如果当前遍历到的元素的值等于要查找的值x
            return i;    //返回当前元素下标
        }
    }
    return 0;
}

 6、顺序表的输出

  • 顺序表的输出通过一个for循环从头到尾遍历各元素并输出表中各元素的值,其中条件<L.length(顺序表的总长度)。具体实现如下:
void print(SeqList *L)
{
	int i;

	if(L->length==0)
	{
		printf("顺序表为空!");
		return 0;
	}
	printf("顺序表为:");
	for(i=0;i<L->length;i++)
	{
		printf(" %d ", L->data[i]);
	}
	printf("\n");
}

四、完整Demo

  • 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;
}
  • 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; 
	} 
	
	//将删除位置后的元素依次前移一位
	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);
		}
	}
}
  •  SeqList.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);
  • welcome.h(函数声明)
char welcome[]=(
    "                ********\n"
    "               ************\n"
    "               ####....#.\n"
    "             #..###.....##....\n"
    "             ###.......######              ###            ###\n"
    "                ...........               #...#          #...#\n"
    "               ##*#######                 #.#.#          #.#.#\n"
    "            ####*******######             #.#.#          #.#.#\n"
    "           ...#***.****.*###....          #...#          #...#\n"
    "           ....**********##.....           ###            ###\n"
    "           ....****    *****....\n"
    "             ####        ####\n"
    "           ######        ######\n"
    "##############################################################\n"
    "#...#......#.##...#......#.##...#......#.##------------------#\n"
    "###########################################------------------#\n"
    "#..#....#....##..#....#....##..#....#....#####################\n"
    "##########################################    #----------#\n"
    "#.....#......##.....#......##.....#......#    #----------#\n"
    "##########################################    #----------#\n"
    "#.#..#....#..##.#..#....#..##.#..#....#..#    #----------#\n"
    "##########################################    ############\n"
    );
  • 运行结果:

                 ********
               ************
               ####....#.
             #..###.....##....
             ###.......######              ###             ###
                ...........                        #...#            #...#
               ##*#######                #.#.#          #.#.#
            ####*******######        #.#.#          #.#.#
           ...#***.****.*###....          #...#           #...#
           ....**********##.....           ###            ###
           ....****    *****....
             ####        ####
           ######        ######
##############################################################
#...#......#.##...#......#.##...#......#.##------------------#
###########################################------------------#
#..#....#....##..#....#....##..#....#....#####################
##########################################    #----------#
#.....#......##.....#......##.....#......#    #----------#
##########################################    #----------#
#.#..#....#..##.#..#....#..##.#..#....#..#    #----------#
##########################################    ############

---------------------顺序表演示程序-------------------
1. 初始化顺序表
2. 插入元素
3. 删除元素
4. 判断顺序表是否为空
5. 判断顺序表是否满
6. 输出顺序表
7. 查找元素
8. 帮助
0. 退出
请输入您要进行的操作(1~8,0退出):1
顺序表已初始化!
1. 初始化顺序表
2. 插入元素
3. 删除元素
4. 判断顺序表是否为空
5. 判断顺序表是否满
6. 输出顺序表
7. 查找元素
8. 帮助
0. 退出
请输入您要进行的操作(1~8,0退出):2
请输入插入位置i,插入元素x(i,x):1,2
元素【2】已插入位置【1】
1. 初始化顺序表
2. 插入元素
3. 删除元素
4. 判断顺序表是否为空
5. 判断顺序表是否满
6. 输出顺序表
7. 查找元素
8. 帮助
0. 退出
请输入您要进行的操作(1~8,0退出):2
请输入插入位置i,插入元素x(i,x):2,3
元素【3】已插入位置【2】
1. 初始化顺序表
2. 插入元素
3. 删除元素
4. 判断顺序表是否为空
5. 判断顺序表是否满
6. 输出顺序表
7. 查找元素
8. 帮助
0. 退出
请输入您要进行的操作(1~8,0退出):6
顺序表为: 2  3
1. 初始化顺序表
2. 插入元素
3. 删除元素
4. 判断顺序表是否为空
5. 判断顺序表是否满
6. 输出顺序表
7. 查找元素
8. 帮助
0. 退出
请输入您要进行的操作(1~8,0退出):3
请输入删除位置i(i):1
位置【1】上的元素已经删除
1. 初始化顺序表
2. 插入元素
3. 删除元素
4. 判断顺序表是否为空
5. 判断顺序表是否满
6. 输出顺序表
7. 查找元素
8. 帮助
0. 退出
请输入您要进行的操作(1~8,0退出):6
顺序表为: 3
1. 初始化顺序表
2. 插入元素
3. 删除元素
4. 判断顺序表是否为空
5. 判断顺序表是否满
6. 输出顺序表
7. 查找元素
8. 帮助
0. 退出
请输入您要进行的操作(1~8,0退出):4
顺序表不为空!
1. 初始化顺序表
2. 插入元素
3. 删除元素
4. 判断顺序表是否为空
5. 判断顺序表是否满
6. 输出顺序表
7. 查找元素
8. 帮助
0. 退出
请输入您要进行的操作(1~8,0退出):5
顺序表未满!
1. 初始化顺序表
2. 插入元素
3. 删除元素
4. 判断顺序表是否为空
5. 判断顺序表是否满
6. 输出顺序表
7. 查找元素
8. 帮助
0. 退出
请输入您要进行的操作(1~8,0退出):6
顺序表为: 3
1. 初始化顺序表
2. 插入元素
3. 删除元素
4. 判断顺序表是否为空
5. 判断顺序表是否满
6. 输出顺序表
7. 查找元素
8. 帮助
0. 退出
请输入您要进行的操作(1~8,0退出):7
请输入你要查找的元素x:3
元素【3】在表中第【1】个位置
1. 初始化顺序表
2. 插入元素
3. 删除元素
4. 判断顺序表是否为空
5. 判断顺序表是否满
6. 输出顺序表
7. 查找元素
8. 帮助
0. 退出
请输入您要进行的操作(1~8,0退出):8
 本程序为顺序表的演示程序,有HQ设计开发,程序实现了对顺序表插入删除查找等功能!
1. 初始化顺序表
2. 插入元素
3. 删除元素
4. 判断顺序表是否为空
5. 判断顺序表是否满
6. 输出顺序表
7. 查找元素
8. 帮助
0. 退出
请输入您要进行的操作(1~8,0退出):0
Press any key to continue


五、小结

        本文详细介绍了顺序表的定义及其特点,以及初始化、插入、删除和查找等基本运算。通过一个简单的C程序实现,展示了顺序表的操作方法。最后,通过一个完整的Demo,验证了顺序表的正确性和可靠性。


六、参考文献 

《数据结构》(C语言版)李刚,刘万辉.北京:高等教育出版社 ,2017.   

《C语言程序设计》(第四版)谭浩强. 北京:清华大学出版社,2014.

  CSDN 数据结构-----顺序表基本操作

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐