目录
一、顺序表的定义及其特点
二、顺序表的运算
三、顺序表的实现
1、顺序表的创建
2、顺序表初始化
3、顺序表的插入
4、顺序表的删除
5、顺序表的查找
6、顺序表的输出
四、完整Demo
五、小结
六、参考文献
一、顺序表的定义及其特点
定义:顺序表是一种线性表的存储结构,它用一组地址连续的存储单位依次存储线性表中的数据元素。从而使得逻辑上相邻的两个元素在物理位置上也相邻。
特点:
- 顺序表具有动态分配空间、支持随机访问和顺序访问,逻辑顺序与物理顺序一致。
- 每个元素可以都有唯一的位置,可以通过索引直接访问元素。
- 元素可以是任意类型,包括基本数据类型、结构体等。
二、顺序表的运算
顺序表的运算主要包括初始化、插入、删除和查找等操作。其中初始化是指将顺序表中所有元素都赋值为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 数据结构-----顺序表基本操作

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/128351.html