数据结构(C语言版)顺序表相关算法代码实现
这两天实现了一下顺序表的相关操作,包括顺序表初始化、创建、遍历、第i个元素前插入,删除第i个元素、查找元素e的位置、清空顺序表、销毁顺序表、合并两个非递减顺序表操作。
这次在网上学习到了新的布局方法,将顺序表的存储结构定义,函数说明部分放在了头文件里,源文件中实现的是主函数和各功能函数。
这次使用的编译环境是vc++6.0
//头文件部分
#define LIST_INIT_SIZE 5
#define INCREAMENT 5
typedef char Elemtype;
typedef int Status;
//线性表存储结构定义
typedef struct {
Elemtype *elem;
int length;
int listsize;
}SqList;
//函数说明部分
Status InitList(SqList &L);
Status CreateList(SqList &L,int size);
Status TraverseList(SqList L);
Status ListInsert(SqList &L,int i,Elemtype e);
Status ListDelete(SqList &L,int i,Elemtype &e);
int LocateElem(SqList L,Elemtype e,Status (*compare)(Elemtype e,Elemtype temp));
Status ClearList(SqList &L);
Status DestroyList(SqList &L);
Status EqualElem(Elemtype e,Elemtype temp);
void MergeList(SqList La,SqList Lb,SqList &Lc); //源文件部分
#include<stdio.h>
#include <stdlib.h>//malloc函数包含在其中
//将自定义头文件包含进来时只能用""
#include"ListHeader.h"
//程序入口
void main(){
int size=;
SqList list;
Elemtype deletes;
InitList(list);
CreateList(list,size);
// TraverseList(list);
// ListInsert(list,5,'o');
// TraverseList(list);
// ListDelete(list,5,deletes);
// TraverseList(list);
// printf("找到符合compare关系的元素位序是:%d\n",LocateElem(list,'b',EqualElem));
// ClearList(list);
// TraverseList(list);
// DestroyList(list);
// TraverseList(list);
SqList list2;
InitList(list2);
CreateList(list2,);
SqList list3;
InitList(list3);
MergeList(list,list2,list3);
TraverseList(list3);
getchar();
}
//初始化一个顺序表
Status InitList(SqList &L){
//分配内存
L.elem = (Elemtype *)malloc(LIST_INIT_SIZE*sizeof(Elemtype));
if(!L.elem){
return false;
}
L.length=;
L.listsize=LIST_INIT_SIZE;
return true;
}
//创建顺序表(判断是否需要重新分配内存,将元素读入)
Status CreateList(SqList &L,int size){
if(size>L.listsize){
Elemtype *newbase;
newbase=(Elemtype *)realloc(L.elem ,(L.listsize+INCREAMENT)*sizeof(Elemtype));
if(!newbase){
return false;
}
L.elem=newbase;
L.listsize+=INCREAMENT;
}
printf("输入创建顺序表内容:\n");
for(int i=;i<size;i++){
scanf("%c",L.elem+i);
getchar();//输入了6个元素,只输入三次就自动结束,因为vc6.0将回车也算进字符里,这里用getchar()接收
}
L.length=size;
return true;
}
//顺序表的遍历,用指针来操作
Status TraverseList(SqList L){
if(L.length==){
printf("空表!");
return false;
}
printf("遍历结果:\n");
for(int i=;i<L.length;i++){
printf("%c",*(L.elem++));
printf("\n");
}
return true;
}
//顺序表中第i个元素之前插入元素,下标是i-1
Status ListInsert(SqList &L,int i,Elemtype e){
//非法判断
if(i<||i>L.length){
return false;
}
if(L.length>=L.listsize){
Elemtype *newbase;//这里为了更好的判断出空间分配结果,新建一个变量newbase
newbase=(Elemtype *)realloc(L.elem,(L.listsize+INCREAMENT)*sizeof(Elemtype));
if(!newbase){
return false;
}
L.listsize+=INCREAMENT;
}
Elemtype *itemp,*ttemp;
itemp=&(L.elem[i-]);
ttemp=&(L.elem[L.length-]);
for(ttemp;ttemp>=itemp;ttemp--){
*(ttemp+)=*ttemp;
}
*itemp=e; //这里的itemp始终指向第i个元素的位置,所以用他赋值较好
L.length+=;
return true;
}
//删除顺序表中第i个元素
Status ListDelete(SqList &L,int i,Elemtype &e){
if(i<||i>L.length){
return false;
}
Elemtype *itemp=&(L.elem[i-]);
e=*itemp;
Elemtype *ttemp=&(L.elem[L.length-]);
for(itemp;itemp<ttemp;itemp++){
*itemp=*(itemp+);
}
L.length--;
return true;
}
//返回顺序表中第一个与e满足compare()关系的元素位序,不存在返回0
int LocateElem(SqList L,Elemtype e,Status (*compare)(Elemtype e,Elemtype temp)){
int i=;
Elemtype *temp=L.elem;
while(!(*compare)(e,*temp)&&i<=L.length){
temp++;
i++;
}
if(i>L.length){
i=;
}
return i;
}
//清空顺序表,只让length=0
Status ClearList(SqList &L){
L.length=;
return true;
}
//销毁顺序表,释放elem指针
Status DestroyList(SqList &L){
if(L.elem){
free(L.elem);
}
L.length=;
return true;
}
//两个元素是否相等
Status EqualElem(Elemtype e,Elemtype temp){
if(e==temp){
return true;
}
return false;
}
//将两个值不递减的顺序表合并到一个新的顺序表中
void MergeList(SqList La,SqList Lb,SqList &Lc){
Lc.listsize=La.length+Lb.length;
Lc.length=Lc.listsize;
Lc.elem=(Elemtype *)malloc(Lc.listsize*sizeof(Elemtype));
Elemtype *pa,*pb,*pa_last,*pb_last,*pc;
pa=&La.elem[];
pb=&Lb.elem[];
pa_last=&(La.elem[La.length-]);
pb_last=&(Lb.elem[Lb.length-]);
pc=&Lc.elem[];
while(pa<=pa_last&&pb<=pb_last){
if(*pa<*pb){
*pc++=*pa++;
}
else{
*pc++=*pb++;
}
}
while(pa<=pa_last){
*pc++=*pa++;
}
while(pb<=pb_last){
*pc++=*pb++;
}
}
数据结构(C语言版)顺序表相关算法代码实现的更多相关文章
- 数据结构(C语言版)顺序栈相关算法的代码实现
这两天完成了栈的顺序存储结构的相关算法,包括初始化.压栈.出栈.取栈顶元素.判断栈是否为空.返回栈长度.栈的遍历.清栈.销毁栈.这次的实现过程有两点收获,总结如下: 一.清楚遍历栈的概念 栈的遍历指的 ...
- 数据结构C语言版 弗洛伊德算法实现
/* 数据结构C语言版 弗洛伊德算法 P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...
- 数据结构C语言版 有向图的十字链表存储表示和实现
/*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...
- 数据结构C语言版 表插入排序 静态表
数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P270 编译 ...
- 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明
<数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑 链接☛☛☛ <数据结构>课本源码合辑 习题集全解析 链接☛☛☛ ...
- c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载
百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...
- 深入浅出数据结构C语言版(1)——什么是数据结构及算法
在很多数据结构相关的书籍,尤其是中文书籍中,常常把数据结构与算法"混合"起来讲,导致很多人初学时对于"数据结构"这个词的意思把握不准,从而降低了学习兴趣和学习信 ...
- 深入浅出数据结构C语言版(2)——简要讨论算法的时间复杂度
所谓算法的"时间复杂度",你可以将其理解为算法"要花费的时间量".比如说,让你用抹布(看成算法吧--)将家里完完全全打扫一遍大概要5个小时,那么你用抹布打扫家里 ...
- 深入浅出数据结构C语言版(17)——有关排序算法的分析
这一篇博文我们将讨论一些与排序算法有关的定理,这些定理将解释插入排序博文中提出的疑问(为什么冒泡排序与插入排序总是执行同样数量的交换操作,而选择排序不一定),同时为讲述高级排序算法做铺垫(高级排序为什 ...
随机推荐
- 一个基于thinkphp的微信授权登陆功能
共享一份基于thinkphp开发的用户授权登陆的功能代码,本实例使用thinkphp的第三方微信公众平台PHP-SDK,地址https://github.com/dodgepudding/wechat ...
- swift学习 - 计时器
swift学习之计时器 这个demo主要学习在swift中如何操作计时器(Timer),按钮(UIButton),文本(Label) 效果图: 代码 import UIKit class ViewCo ...
- Java基础知识二次学习--第八章 流
第八章 流 时间:2017年4月28日11:03:07~2017年4月28日11:41:54 章节:08章_01节 视频长度:21:15 内容:IO初步 心得: 所有的流在java.io包里面 定 ...
- 关于Python编码,超诡异的,我也是醉了
Python的编码问题,真是让人醉了.最近碰到的问题还真不少.比如中文文件名.csv .python对外呈现不一致啊,感觉好不公平. 没图说个JB,下面立马上图. 我早些时候的其他脚本,csv都是 ...
- linux不需要密码ssh登陆
1. 自动ssh/scp方法A为本地主机(即用于控制其他主机的机器) ;B为远程主机(即被控制的机器Server), 假如ip为192.168.60.110;A和B的系统都是Linux在A上运行命令: ...
- CAP原理、一致性模型、BASE理论和ACID特性
CAP原理 在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点: 一致性(Con ...
- springboot 1.5.2 thymeleaf 添加templates 静态资源访问路径
从velocity 模板切换到thymeleaf 后, 默认模板位置为templates , 有时候静态资源方在该目录下会出现访问404错误 解决办法: application.properties ...
- python爬虫从入门到放弃(七)之 PyQuery库的使用
PyQuery库也是一个非常强大又灵活的网页解析库,如果你有前端开发经验的,都应该接触过jQuery,那么PyQuery就是你非常绝佳的选择,PyQuery 是 Python 仿照 jQuery 的严 ...
- java中的各种流(老师的有道云笔记)
内存操作流-字节 之前的文件操作流是以文件的输入输出为主的,当输出的位置变成了内存,那么就称为内存操作流.此时得使用内存流完成内存的输入和输出操作. 如果程序运行过程中要产生一些临时文件,可采用虚拟文 ...
- Django中的枚举类型
一.枚举类型示例 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期.月份.状态等.Python 的原生类型(Built-in types)里并没有专门的枚举类型 ...