纯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) 链 ...
随机推荐
- AssetBundleMaster_Introduce_EN
This is an integrated solution for building AssetBundles and loading Assets. what it can do is about ...
- [原创]python+beautifulsoup爬取整个网站的仓库列表与仓库详情
from bs4 import BeautifulSoup import requests import os def getdepotdetailcontent(title,url):#爬取每个仓库 ...
- 201871010126 王亚涛 《面向对象程序设计JAVA》第十四周学习总结
内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/11 ...
- SHELL脚本--变量
环境变量 环境变量就是运行在"环境"上下文的,在这个上下文都可以引用.例如,常见的cd.ls等命令严格来说应该使用绝对路径如/bin/ls来执行,由于/bin目录加入到了PATH环 ...
- 源码解读:webdriver client的原理
前言 又到年底了,群里很多朋友说要开始备战2020金三银四,其实,我建议是,如果你不是技术大牛,就不要去凑热闹. 其实,现在(11,12月份)就是最佳换工作的时候,因为很多人想等着拿了年终再走,虽然招 ...
- Excel-信息函数&数组公式
1.IS系列函数-逻辑函数 is函数是一个逻辑函数,可以用来判断一些特定的内容 Istext判断单元格是否是文本 Isnumber判断单元格是否为数值 Istext和isnumber的判断的结果相反 ...
- github新建本地仓库并将代码提交到远程仓库
方式一: 在github上新建好仓库:gitTest 使用命令git clone git@github.com:yourgithubID/gitTest.git,克隆到本地相应的位置 将要上传的工程代 ...
- [LeetCode] 14. Longest Common Prefix 最长共同前缀
Write a function to find the longest common prefix string amongst an array of strings. If there is n ...
- 第09组 Beta冲刺(2/5)
队名:观光队 链接 组长博客 作业博客 组员实践情况 王耀鑫 过去两天完成了哪些任务 文字/口头描述 学习 展示GitHub当日代码/文档签入记录 接下来的计划 完成短租车,页面美化 还剩下哪些任务 ...
- C++版本 ORM 访问数据库之ODB 的Window环境编译(一)
先简单说说我为什么要编译一个ORM访问数据库的版本, 以前在做C#访问数据库时候, 直接以orm方式访问数据库, 代码写起来简单, 不用写各种复杂的sql语句, 直接有orm框架生成, 后来转到C+ ...