纯C语言实现线性表
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 typedef int ElemType; typedef struct{
ElemType data[MAXSIZE];
int length;
}SqList; SqList *InitList(SqList *L);//初始化
void DestroyList(SqList *L);//销毁
void ClearList(SqList *L);//清空列表
int ListEmpty(SqList *L);//判空
int ListLength(SqList *L);//返回线性表长度
int GetElem(SqList *L, int i, ElemType *e);//获取第i个元素
int LocateElem(SqList *L, ElemType e);//定位值为e的位置
ElemType PriorElem(SqList *L, ElemType cur_e);//查找前驱
ElemType NextElem(SqList *L, ElemType cur_e);//查找后继
int ListInsert(SqList *L, int i, ElemType e);//插入元素
int ListDelete(SqList *L, int i);//删除第i个元素
int TraverseList(SqList *L);//遍历线性表 //初始化线性表,返回头指针
SqList* InitList(SqList *L){
int x;
int index = ; L = (SqList *)malloc(sizeof(SqList));
if(L){
printf("输入到-1结束\n");
while(){
scanf("%d", &x);
if(x == -){
printf("初始化成功\n");
break;
};
L->data[index++] = x;
}
L->length = index;
}else{
printf("空间不足,初始化失败\n");
}
return L;
} //销毁线性表
void DestroyList(SqList *L){
free(L);
printf("销毁成功\n");
} //清空线性表
void ClearList(SqList *L){
int len = L->length;
int i;
for(i=; i<len; i++){
L->data[i] = ;
}
printf("清空成功\n");
} //判空,1为空,0不为空
int ListEmpty(SqList *L){
return (L->length == );
} //返回线性表长度
int ListLength(SqList *L){
return L->length;
} //获取第i个元素,返回是否获取的状态
int GetElem(SqList *L, int i, ElemType *e){
if(i< || i>L->length){
printf("查找下标%d越界\n",i);
return ;
}
*e = L->data[i-];
printf("第%d个元素是%d\n", i, *e);
return ;
} //返回第一个与e相同元素的位置,返回找寻到的下标
int LocateElem(SqList *L, ElemType e){
int i;
for(i=; i<L->length; i++){
if(L->data[i] == e){
printf("元素%d的位置是第%d个\n",e,i+);
return i+;
} }
printf("%d, 查无此元素的下标\n", e);
return ;
}
//返回元素为e的前驱元素
ElemType PriorElem(SqList *L, ElemType cur_e){
int idx = LocateElem(L, cur_e);
ElemType e;
if(!idx){
return ;
}
if(idx == ){
printf("第一个元素%d没有前驱\n", cur_e);
return ;
}
GetElem(L, idx-, &e);
printf("%d元素的前驱是%d\n",cur_e, e);
return e;
}
//返回元素e的后继元素
ElemType NextElem(SqList *L, ElemType cur_e){
int idx = LocateElem(L, cur_e);
ElemType e;
if(!idx){
return ;
}
if(idx == L->length){
printf("最后一个元素%d没有后继\n", cur_e);
return ;
}
GetElem(L, idx+, &e);
printf("%d元素的后继是%d\n",cur_e, e);
return e;
}
//插入,返回是否插入成功的状态
int ListInsert(SqList *L, int i, ElemType e){
if(i< || i>L->length+){
printf("插入位置有误\n");
return ;
}
if(L->length == MAXSIZE){
printf("线性表已满无法插入新元素\n");
return ;
}
int j;
for(j=L->length-; j>=i-; j--){
L->data[j+] = L->data[j];
}
L->data[i-] = e;
L->length++;
printf("插入成功\n");
return ;
}
//删除第i个元素,返回是否删除成功的状态
int ListDelete(SqList *L, int i){
if(i< || i>L->length){
printf("删除位置有误\n");
return ;
}
int j;
for(j=i; j<L->length; j++){
L->data[j-] = L->data[j];
}
L->length--;
printf("删除成功\n");
return ;
} //遍历线性表
int TraverseList(SqList *L){
if(L->length == ){
printf("空表\n");
return ;
}
if(L->length>MAXSIZE || L->length<-MAXSIZE){
printf("线性表已被摧毁或未初始化\n");
return ;
}
int j;
for(j=; j<L->length; j++){
printf("%d ", L->data[j]);
}
printf("\n");
} int main(void){
int idx;
int len;
ElemType e;
ElemType cur_e;
SqList *L = NULL; L = InitList(L); // printf("线性表长度为%d\n",ListLength(L)); // //判空测试
// if(ListEmpty(L))
// printf("线性表空\n");
// else
// printf("线性表不为空\n"); // //获取元素测试
// idx = 2;
// GetElem(L, idx, &e);
// GetElem(L, L->length+1, &e); // //获取位置测试
// LocateElem(L, 3); // //获取前驱测试
// cur_e = 4;
// PriorElem(L, cur_e);
// GetElem(L, 1, &cur_e);
// PriorElem(L, cur_e); // //插入测试
// ListInsert(L, 1, 999);
// TraverseList(L);
// ListInsert(L, L->length+1, 999);
// TraverseList(L); // //删除测试
// ListDelete(L, 1);
// TraverseList(L); // //清空测试
// ClearList(L);
// TraverseList(L); // //摧毁测试
// DestroyList(L);
// TraverseList(L);
return ;
}
书虽然说是C语言实现,但基本都是用C++的引用参数。
我就尝试把所有的用C语言实现,基本和书上的参数都是一一对应的,
把初始化的返回值改为了一个指针返回,就不用搞那种地址传递还是值传递的问题。
摧毁的功能还有点问题,debug正常,但是正常运行,表内的值还有保留的,百度下来
好像说free这个并不是真正意义上的都释放了。
如果有问题,请指出,我好进行改进。
纯C语言实现线性表的更多相关文章
- 使用C语言实现线性表
线性表是最常用且最简单的一种数据结构.一个线性表是n个数据元素的有限序列,序列中的每个数据元素,可以是一个数字,可以是一个字符,也可以是复杂的结构体或对象.例如:1,2,3,4,5是一个线性表,A,B ...
- 浅谈c语言的线性表的基本操作———基于严蔚敏的数据结构(c语言版)
主要讲的是线性表的创建,插入及删除: 0. 线性表的建立,对于这类操作主要是利用了结构体的性质,对于定义的线性表的特性主要有三点:首先 Typedef struct { ElemType *ele ...
- 学习使用C语言实现线性表
线性表是最常用且最简单的一种数据结构.一个线性表是n个数据元素的有限序列,序列中的每个数据元素,可以是一个数字,可以是一个字符,也可以是复杂的结 构体或对象.例如:1,2,3,4,5是一个线性表,A, ...
- C语言实现线性表
#include <stdio.h> #include <stdlib.h> //提供malloc()原型 /* 线性表需要的方法: 1. List MakeEmpty():初 ...
- 纯C语言实现线性链表
#include <stdio.h> #include <stdlib.h> typedef int ElemType; typedef struct LNode{ ElemT ...
- C语言实现线性表(链式存储方式)
#include <stdio.h> #include <stdlib.h> //提供malloc()原型 typedef struct LNode *List; typede ...
- 数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表
一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...
- 数据结构算法C语言实现(一)---2.2线性表的顺序表示和实现
注意: 虽然是用C语言实现,但是考虑到使用了一个C++的特性----引用以简化代码,所以所有的代码均以cpp作为后缀,用g++编译(以后不做说明). g++版本: 一.简述 本节主要讲述线性表的顺序实 ...
- 线性表之顺序存储结构(C语言动态数组实现)
线性表的定义:N个数据元素的有限序列 线性表从存储结构上分为:顺序存储结构(数组)和 链式存储结构(链表) 顺序存储结构:是用一段连续的内存空间存储表中的数据 L=(a1,a2,a3....an) 链 ...
随机推荐
- TCP /IP协议详解【转】
转自:https://www.jianshu.com/p/0cf648510bce?utm_campaign=maleskine&utm_content=note&utm_medium ...
- Django类
django 1.中间件 中间件一般做认证或批量请求处理,django中的中间件,其实是一个类,在请求和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法, 如请求过来 执行p ...
- 关于JMeter线程组中线程数,Ramp-Up Period,循环次数之间的设置概念
关于JMeter线程组中线程数,Ramp-Up Period,循环次数之间的设置概念 笔者是个刚刚踏入压力测试领域不到2个月的小菜,这里分享一下线程组中3个参数之间关系的个人见解,不喜请!喷!,望大家 ...
- 交换机与MPLS
在这一篇里面主要阐述交换机与MPLS的相似点.
- mybatis-config.xml 知识点
typeAliases 标签:配置别名,主要用于 XML 文件中的 resultType 参数. mappers 标签:配置所有的 mapper. MyBatis 和 Spring Boot 配合使用 ...
- 一篇文章搞定git
git学习 一.背景(当成故事去读) Linus 虽然创建了 Linux,但 Linux 的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为 Linux 编写代码,那 Linux 的代码是如何管 ...
- 洛谷 P3998 [SHOI2013]发微博
洛谷 P3998 [SHOI2013]发微博 洛谷传送门 题目描述 刚开通的 SH 微博共有n个用户(1Ln标号),在这短短一个月的时间内, 用户们活动频繁,共有m 条按时间顺序的记录: ! x 表示 ...
- 【LG1600】[NOIP2016]天天爱跑步
[LG1600][NOIP2016]天天爱跑步 题面 洛谷 题解 考虑一条路径\(S\rightarrow T\)是如何给一个观测点\(x\)造成贡献的, 一种是从\(x\)的子树内出来,另外一种是从 ...
- MySQL实战45讲学习笔记:第一讲
一.MySQL逻架构图 二.连接器工作原理刨析 1.连接器工作原理图 2.原理图说明 1.连接命令 mysql -h$ip -P$port -u$user -p 2.查询链接状态 3.长连接端连接 1 ...
- TextView实现文字水平滚动效果
有时候我们使用TextView显示文本,只想把所有内容用一行显示出来,但是一行又显示不完,就需要让文本实现水平滚动的效果. 具体实现方法如下: 1,实现自定义TextView并实现isFocused( ...