纯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) 链 ...
随机推荐
- jquery实现一些小动画二
jquery实现一些小动画二 jquery实现拖拽功能 <!DOCTYPE html> <html lang="en"> <head> < ...
- Java八大排序之插入排序
插入排序 也可叫直接插入排序,该算法的思路是:初始可认为文件中的第1个记录已排好序,然后将第2个到第n个记录依次插入到已排序的记录组成的文件中. 步骤: 假设有一组数组为(数组下标0—n-1): ar ...
- 语义分析的waf 目前就看到长亭 机器学习的waf有fortnet 阿里云的waf也算
近期,在全球权威咨询机构 Gartner 发布的 2019 Web 应用防火墙魔力象限中,阿里云 Web 应用防火墙成功入围,是亚太地区唯一一家进入该魔力象限的厂商! Web 应用防火墙,简称 WAF ...
- 4-剑指offer: 把数组排成最小的数
题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 代码: cl ...
- Go语言调度器之调度main goroutine(14)
本文是<Go语言调度器源代码情景分析>系列的第14篇,也是第二章的第4小节. 上一节我们通过分析main goroutine的创建详细讨论了goroutine的创建及初始化流程,这一节我们 ...
- 201871020225-牟星源《面向对象程序设计(java)》第七周学习总结
201871020225-牟星源<面向对象程序设计(java)>第七周学习总结 博文正文开头: 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu- ...
- Docker镜像(六)
一.镜像是什么 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件. 1. UnionFS( ...
- node端console.log输出不同颜色文字
我们知道console.log直接输出是按着终端的默认颜色来显示的, console.log('message') 那么如何指定他们的颜色显示呢?很简单,直接再加一个参数就可以了,例如: consol ...
- JDOJ 1789: 高精度A+B
JDOJ 1789: 高精度A+B JDOJ传送门 洛谷 P1601 A+B Problem(高精) 洛谷传送门 Description 已知两个整数A.B 求A+B Input 第一行为A 第二行为 ...
- Python进阶-VI 生成器函数进阶、生成器表达式、推导式
一.生成器函数进阶 需求:求取移动平均数 1.应用场景之一,在奥运会气枪射击比赛中,每打完一发都会显示平均环数! def show_avg(): print('你已进入显示移动平均环数系统!') a ...