线性表学习归纳总结二:线性表顺序存储实现
2015-05-29 14:42
363 查看
线性表顺序存储实现
顺序表的存储结构
顺序表基本实现
sequlist.c文件
测试main函数为:
运行结果:
顺序表的存储结构
<span style="font-size:14px;">#define MAXSIZE 100 typedef int datatype; typedef struct{ datatype a[MAXSIZE]; //定义一个大小为100的int类型数组 int size; //size是存储这个数组中有意义数据的个数 }sequence_list;</span>
顺序表基本实现
<span style="font-size:14px;">void init (sequence_list *slt); //顺序表的初始化——置空表 void append (sequence_list *slt, datatype x); //在顺序表后部插入值为x的结点 void display (sequence_list *slt); //打印顺序表的各结点值 int empty(sequence_list slt); //判断顺序表是否为空 int find(sequence_list slt, datatype x); //查找顺序表中值为x的结点位置 datatype get(sequence_list slt, int i); //取得顺序表中第i个结点的值 void insert(sequence_list *slt, datatype x, int position); //在顺序表的position位置插入值为x的结点 void dele(sequence_list *slt, int position); //删除表中第position位置的结点</span>
sequlist.c文件
<span style="font-size:14px;">#include <stdlib.h> #include <stdio.h> #include "sequlist.h" /************************************************************************/ /* 函数功能: 顺序表的初始化——置空表 */ /* 函数参数: 指向sequence_list型变量的指针变量slt */ /* 函数返回值:空 */ /* 文件名:sequlist.c, 函数名:init() */ /************************************************************************/ void init (sequence_list *slt) { slt->size = 0; for (int i=0; i<MAXSIZE; i++) { slt->a[i] = 0; } } /************************************************************************/ /* 函数功能: 在顺序表后部进行插入操作 */ /* 函数参数: 指向sequence_list型变量的指针slt */ /* datatype类型的变量x */ /* 函数返回值: 空 */ /* 文件名: sequlist.c, 函数名: append() */ /************************************************************************/ void append (sequence_list *slt, datatype x) { if (slt->size == MAXSIZE) { printf("顺序表是满的!"); exit(1); } slt->a[slt->size] = x; //将x值写入顺序表后面 slt->size = slt->size + 1; //slt->size指向的是顺序表中当前存储数值的下一个位置 } /************************************************************************/ /* 函数功能: 打印顺序表的各结点值 */ /* 函数参数: sequence_list型变量slt */ /* 函数返回值: 空 */ /* 文件名: sequlist.c,函数名: display() */ /************************************************************************/ void display (sequence_list *slt) { int i; if (!slt->size) { printf("\n顺序表的空的!"); } else { for (i=0;i<slt->size;i++) { printf("%c",slt->a[i]); //printf("%5d",slt->a[i]); } } printf("\n"); } /************************************************************************/ /* 函数功能:判断顺序表是否为空 */ /* 函数参数:sequence_list型变量slt */ /* 函数返回值: int类型。 1表示空,0表示非空 */ /* 文件名: sequlist.c,函数名: empty() */ /************************************************************************/ int empty(sequence_list slt) { return(slt.size==0 ? 1 : 0); } /************************************************************************/ /* 函数功能: 查找顺序表中值为x的结点位置 */ /* 函数参数: sequence_list型变量slt,datatype型变量x */ /* 函数返回值:int类型。返回x的位置值,-1表示没有找到 */ /* 文件名: sequlist.c,函数名:find() */ /************************************************************************/ int find(sequence_list slt, datatype x) { int i = 0; while (i<slt.size && slt.a[i] != x) //i从0初始位置开始遍历,循环在i遍历完整个顺序表停止,或者在查找到x停止,并显示查找到的当前i值 { i++; } return(i<slt.size ? i : -1); } /************************************************************************/ /* 函数功能: 取得顺序表中的第i个结点的值 */ /* 函数参数: sequence_list型变量slt,int型变量i */ /* 函数返回值: datatype类型。返回第i个结点的值 */ /* 文件名:sequlist.c,函数名: get() */ /************************************************************************/ datatype get(sequence_list slt, int i) { if (i<0 || i>=slt.size) { printf("\n指定位置的结点不存在!"); exit(1); } else { return slt.a[i]; } } /************************************************************************/ /* 函数功能: 在顺序表的position位置插入值为x的结点 */ /* 函数参数: 指向sequence_list型变量的指针slt */ /* datatype型变量x,int型变量position */ /* 函数返回值: 空 */ /* 文件名: sequlist.c,函数名: insert() */ /************************************************************************/ void insert(sequence_list *slt, datatype x, int position) { int i; if (slt->size == MAXSIZE) { printf("/n顺序表是满的!没法插入!"); exit(1); } if (position<0 || position>slt->size) { printf("/n指定的插入位置不存在!"); exit(1); } for (i=slt->size; i>position; i--) //这个循环里面是将position开始的数组值移到下一个位置 { slt->a[i] = slt->a[i-1]; } slt->a[position] = x; slt->size++; } /************************************************************************/ /* 函数功能: 删除顺序表中第position位置的结点 */ /* 函数参数: 指向sequence_list型变量的指针变量slt */ /* int型变量position */ /* 函数返回值: 空 */ /* 文件名:sequlist.c,函数名:dele() */ /************************************************************************/ void dele(sequence_list *slt, int position) { int i; if (slt->size == 0) { printf("/n顺序表是空的!"); exit(1); } if (position<0 || position>=slt->size) { printf("/n指定的删除位置不存在!"); exit(1); } for (i=position; i<slt->size; i++) //将position位置之后的数组数据往前移动一个位置 { slt->a[i] = slt->a[i+1]; } slt->size--; }</span>
测试main函数为:
<span style="font-size:14px;">#include <stdio.h> #include <stdlib.h> #include "sequlist.h" void main(void) { sequence_list sqlst, *p_sqlst; //顺序表初始化 init(&sqlst); p_sqlst = &sqlst; //利用在顺序表后面插入元素的方法建立一个新的顺序表 int getin; while (scanf("%d", &getin)==1 && sqlst.size<MAXSIZE) { append(p_sqlst, getin); } display(p_sqlst); //打印输出 //可以循环查找的函数体 int search_num; puts("输入待查找元素"); while (scanf("%d", &search_num) == 1) { printf("待查找元素%d的结点位置为%d\n", search_num, find(sqlst, search_num)); puts("输入待查找元素"); } //取得顺序表中第i个结点的值 int i; puts("输入数值i"); while(scanf("%d", &i) == 1) { printf("顺序表中第%d个结点的值为%d\n", i, get(sqlst, i)); puts("输入数值i"); } //在顺序表的position位置插入值为x的结点 int position, x; puts("输入插入位置positon和插入值x"); while(scanf("%d, %d", &position, &x) == 2) { insert(p_sqlst, x, position); puts("插入结果为:"); display(p_sqlst); puts("输入插入位置positon和插入值x"); } //删除表中第position位置的结点 int dele_position; puts("输入待删除结点位置position"); while (scanf("%d", &dele_position) == 1) { dele(p_sqlst, dele_position); puts("删除结果为:"); display(p_sqlst); puts("输入待删除结点位置position"); } system("pause"); }</span>
运行结果:
相关文章推荐
- Web_JavaScript_去除JS字串两边空格;
- 网上找的查询本地接口的代码 来记录一下
- 2015年任务
- eclipse编辑XML的时候启动提示功能(图文)
- OSError: [Errno 2] No such file or directory
- HashMap与HashTable的区别、HashMap与HashSet的关系
- 北大操作系统公开课-文件系统2
- linux系统修改系统时间与时区
- Sql Server 创建表分区
- java.util.Properties类的使用
- 152 Maximum Product Subarray
- 1207: C.LU的困惑
- 《Entity Framework 6 Recipes》中文翻译系列 (31) ------ 第六章 继承与建模高级应用之自引用关联
- GNS3 模拟网络路由交换远程登录
- 使用国内镜像在线更新AndroidSDK和Library
- SQL Server2008中CROSS APPLY的应用范例(一)-将多个不同值更新到不同条件匹配的记录中
- SwitchButton开关按钮的多种实现方式
- Storm集群安装步骤
- GitHub 优秀的 Android 开源项目
- 小心C语言localtime和asctime时间函数陷阱