当前位置:   article > 正文

数据结构——顺序表详解

顺序表

目录

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

二、顺序表的运算

三、顺序表的实现 

1、顺序表的创建

2、顺序表初始化

3、顺序表的插入

4、顺序表的删除

5、顺序表的查找

6、顺序表的输出

四、完整Demo

五、小结

六、参考文献 


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

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

特点:

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

二、顺序表的运算

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


三、顺序表的实现 

1、顺序表的创建

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

2、顺序表初始化

  • 只需要将存储空间的大小设置为初始值0即可。具体实现如下:
  1. /*顺序表初始化*/
  2. int init(SeqList *L)
  3. {
  4. L->length = 0; // 初始时,顺序表长度为0
  5. return 0;
  6. }

3、顺序表的插入

  • 在顺序表插入元素,需要先找到插入的位置,然后将后一个元素依次往后移动一位,最后将新元素放到指定位置。如果插入位置超过了当前长度,则无法执行插入操作。具体实现如下:
  1. /*插入元素*/
  2. int insert(SeqList *L, int i, DataType x)
  3. {
  4. int j;
  5. /*判断是否满*/
  6. if(full(L))
  7. { // 如果顺序表已满,则无法插入
  8. printf("Error[10001],顺序表已满!\n");
  9. return 10001;
  10. }
  11. /*判断位置i合法性*/
  12. if(i<1 || i>length(L)+1) // 如果插入位置不合法,则无法插入
  13. {
  14. printf("Error[10002],位置i不合法!\n");
  15. return 10002;
  16. }
  17. /*移动元素,向后移动*/
  18. for(j=L->length;j>=i;j--) // 将插入位置后的元素依次后移一位
  19. {
  20. L->data[j] = L->data[j-1];
  21. }
  22. L->data[j] = x; // 在指定位置插入元素
  23. L->length++; // 顺序表长度加1
  24. return 0; /*ok!*/
  25. }

4、 顺序表的删除

  • 在顺序表中删除一个元素首先要找到删除元素的位置,然后将该位置后面的元素依次向前移动一位,覆盖掉要删除的元素,并更新顺序表的长度。具体实现如下:
  1. /*删除元素*/
  2. int delete(SeqList *L, int i, DataType *x)
  3. {
  4. int k;
  5. if(i<1||i>=L->length+1){ //如果删除位置不合法,则无法删除
  6. printf("Error[1003],删除位置i不合法\n");
  7. return 10003;
  8. }
  9. //将删除位置后的元素依次前移一位
  10. for(k=i-1;k<L->length-1;k++){
  11. L->data[k]=L->data[k+1];
  12. }
  13. //顺序表长度减一
  14. L->length--;
  15. return 0;
  16. }

5、 顺序表的查找

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

 6、顺序表的输出

  • 顺序表的输出通过一个for循环从头到尾遍历各元素并输出表中各元素的值,其中条件<L.length(顺序表的总长度)。具体实现如下:
  1. void print(SeqList *L)
  2. {
  3. int i;
  4. if(L->length==0)
  5. {
  6. printf("顺序表为空!");
  7. return 0;
  8. }
  9. printf("顺序表为:");
  10. for(i=0;i<L->length;i++)
  11. {
  12. printf(" %d ", L->data[i]);
  13. }
  14. printf("\n");
  15. }

四、完整Demo

  • main.c(主函数)
  1. #include <stdio.h>
  2. #include "SeqList.h"
  3. #include "welcome.h"
  4. #include<string.h>
  5. int main(int argc, char* argv[])
  6. {
  7. SeqList L;
  8. int cmd;
  9. int i;
  10. int m,n;
  11. DataType x;
  12. for(i=0;i<strlen(welcome);i++)
  13. {
  14. printf("%c",welcome[i]);
  15. for(m=0;m<1000;m++)
  16. for(n=0;n<1000;n++)
  17. {
  18. ;
  19. }
  20. }
  21. printf("\n\n\n");
  22. printf("---------------------顺序表演示程序-------------------\n");
  23. do
  24. {
  25. printf("1. 初始化顺序表\n");
  26. printf("2. 插入元素\n");
  27. printf("3. 删除元素\n");
  28. printf("4. 判断顺序表是否为空\n");
  29. printf("5. 判断顺序表是否满\n");
  30. printf("6. 输出顺序表\n");
  31. printf("7. 查找元素\n");
  32. printf("8. 帮助\n");
  33. printf("0. 退出\n");
  34. printf("请输入您要进行的操作(1~8,0退出):");
  35. scanf("%d", &cmd);
  36. switch(cmd)
  37. {
  38. case 1:
  39. if(!init(&L))
  40. {
  41. printf("顺序表已初始化!\n");
  42. }
  43. break;
  44. case 2:
  45. printf("请输入插入位置i,插入元素x(i,x):");
  46. scanf("%d,%d",&i,&x);
  47. if(!insert(&L,i,x))
  48. {
  49. printf("元素【%d】已插入位置【%d】\n",x, i);
  50. }
  51. break;
  52. case 3:
  53. printf("请输入删除位置i(i):");
  54. scanf("%d",&i);
  55. if(!delete(&L,i,&x)){
  56. printf("位置【%d】上的元素已经删除\n",i, x);
  57. }
  58. break;
  59. case 4:
  60. if(empty(&L))
  61. {
  62. printf("顺序表为空\n");
  63. }
  64. else
  65. {
  66. printf("顺序表不为空!\n");
  67. }
  68. break;
  69. case 5:
  70. if(full(&L))
  71. {
  72. printf("顺序表已满!\n");
  73. }
  74. else
  75. {
  76. printf("顺序表未满!\n");
  77. }
  78. break;
  79. case 6:
  80. print(&L);
  81. break;
  82. case 7:
  83. printf("请输入你要查找的元素x:");
  84. scanf("%d",&x);
  85. find(&L,x,i);
  86. break;
  87. case 8:
  88. printf(" 本程序为顺序表的演示程序,有HQ设计开发,程序实现了对顺序表插入删除查找等功能!\n");
  89. break;
  90. }
  91. }while(cmd != 0);
  92. return 0;
  93. }
  • SeqList.c(函数实现)
  1. /*
  2. SeqList.c 顺序表实现
  3. */
  4. #include "SeqList.h"
  5. /*顺序表初始化*/
  6. int init(SeqList *L)
  7. {
  8. L->length = 0;
  9. return 0;
  10. }
  11. /*顺序表的长度*/
  12. int length(SeqList *L)
  13. {
  14. return L->length;
  15. }
  16. /*顺序表是否满*/
  17. int full(SeqList *L)
  18. {
  19. return (L->length == MAXSIZE)?1:0;
  20. }
  21. /*是否空*/
  22. int empty(SeqList *L)
  23. {
  24. return (L->length == 0)?1:0;
  25. }
  26. /*插入元素*/
  27. int insert(SeqList *L, int i, DataType x)
  28. {
  29. int j;
  30. /*判断是否满*/
  31. if(full(L))
  32. {
  33. printf("Error[10001],顺序表已满!\n");
  34. return 10001;
  35. }
  36. /*判断位置i合法性*/
  37. if(i<1 || i>length(L)+1)
  38. {
  39. printf("Error[10002],位置i不合法!\n");
  40. return 10002;
  41. }
  42. /*移动元素,向后移动*/
  43. for(j=L->length;j>=i;j--)
  44. {
  45. L->data[j] = L->data[j-1];
  46. }
  47. L->data[j] = x;
  48. L->length++;
  49. return 0; /*ok!*/
  50. }
  51. /*删除元素*/
  52. int delete(SeqList *L, int i, DataType *x)
  53. {
  54. int k;
  55. if(i<1||i>=L->length+1){ //如果删除位置不合法,则无法删除
  56. printf("Error[1003],删除位置i不合法\n");
  57. return 10003;
  58. }
  59. //将删除位置后的元素依次前移一位
  60. for(k=i-1;k<L->length-1;k++){
  61. L->data[k]=L->data[k+1];
  62. }
  63. //顺序表长度减一
  64. L->length--;
  65. return 0;
  66. }
  67. /*输出顺序表*/
  68. void print(SeqList *L)
  69. {
  70. int i;
  71. if(empty(L))
  72. {
  73. printf("顺序表为空!\n");
  74. return 0 ;
  75. }
  76. printf("顺序表为:");
  77. for(i=0;i<L->length;i++)
  78. {
  79. printf(" %d ", L->data[i]);
  80. }
  81. printf("\n");
  82. }
  83. /*查找元素*/
  84. int find(SeqList *L,int x)
  85. {
  86. int i;
  87. for (i=0;i<L->length;i++){
  88. if (L->data[i]==x){
  89. printf("元素【%d】在表中第【%d】个位置\n",x,i+1);
  90. }
  91. }
  92. }
  •  SeqList.h(函数声明/顺序表结构体)
  1. /*
  2. SeqList.h 顺序表定义
  3. */
  4. #define MAXSIZE 1000
  5. typedef int DataType;
  6. /*顺序表*/
  7. typedef struct
  8. {
  9. DataType data[MAXSIZE];
  10. int length;
  11. }SeqList;
  12. /*顺序表初始化*/
  13. int init(SeqList *L);
  14. /*顺序表的长度*/
  15. int length(SeqList *L);
  16. /*顺序表是否满*/
  17. int full(SeqList *L);
  18. /*是否空*/
  19. int empty(SeqList *L);
  20. /*插入元素*/
  21. int insert(SeqList *L, int i, DataType x);
  22. /*删除元素*/
  23. int delete(SeqList *L, int i, DataType x);
  24. /*输出顺序表*/
  25. void print(SeqList *L);
  26. /*查找元素*/
  27. int find(SeqList *L, int i, DataType x);
  • welcome.h(函数声明)
  1. char welcome[]=(
  2. " ********\n"
  3. " ************\n"
  4. " ####....#.\n"
  5. " #..###.....##....\n"
  6. " ###.......###### ### ###\n"
  7. " ........... #...# #...#\n"
  8. " ##*####### #.#.# #.#.#\n"
  9. " ####*******###### #.#.# #.#.#\n"
  10. " ...#***.****.*###.... #...# #...#\n"
  11. " ....**********##..... ### ###\n"
  12. " ....**** *****....\n"
  13. " #### ####\n"
  14. " ###### ######\n"
  15. "##############################################################\n"
  16. "#...#......#.##...#......#.##...#......#.##------------------#\n"
  17. "###########################################------------------#\n"
  18. "#..#....#....##..#....#....##..#....#....#####################\n"
  19. "########################################## #----------#\n"
  20. "#.....#......##.....#......##.....#......# #----------#\n"
  21. "########################################## #----------#\n"
  22. "#.#..#....#..##.#..#....#..##.#..#....#..# #----------#\n"
  23. "########################################## ############\n"
  24. );
  • 运行结果:

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

---------------------顺序表演示程序-------------------
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 数据结构-----顺序表基本操作

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/439892
推荐阅读
相关标签
  

闽ICP备14008679号