纯C语言实现线性链表
#include <stdio.h>
#include <stdlib.h> typedef int ElemType; typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode; LNode *InitList(LNode *L);//初始化
LNode *DestroyList(LNode *L);//销毁
void ClearList(LNode *L);//清空列表
int ListEmpty(LNode *L);//判空
int ListLength(LNode *L);//返回链表长度
int GetElem(LNode *L, int i, ElemType *e);//获取第i个元素
LNode* LocateElem(LNode *L, ElemType e);//定位值为e的位置
ElemType PriorElem(LNode *L, ElemType cur_e);//查找前驱
ElemType NextElem(LNode *L, ElemType cur_e);//查找后继
int ListInsert(LNode *L, int i, ElemType e);//插入元素
int ListDelete(LNode *L, int i);//删除第i个元素
void TraverseList(LNode *L);//遍历线性表 //初始化
LNode *InitList(LNode *L){
int x;
LNode *p = NULL;//记录前一个节点
LNode *q = NULL;//记录后一个节点 L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;
p = L; printf("输入直到-1为止\n");
while(){
scanf("%d", &x);
if(x == -) {
printf("初始化成功\n");
break;
}
//初始化并赋值
q = (LNode *)malloc(sizeof(LNode));
if(q){
q->data = x;
q->next = NULL;
//和前一个节点连接
p->next = q;
//遍历下去
p = p->next;
}else{
printf("空间不足,初始化失败\n");
return NULL;
} }
return L;
} //销毁
LNode *DestroyList(LNode *L){
LNode *p = L->next;//记录前一个元素
LNode *q = p->next;//记录后一个元素
while(q){
free(p);
p = q;
q = q->next;
}
free(p);
free(L);
printf("销毁成功\n");
return NULL;
} //清空列表
void ClearList(LNode *L){
LNode *p = L->next;
while(p){
p->data = ;
p = p->next;
}
printf("清空成功\n");
} //判空,1为空,0不为空
int ListEmpty(LNode *L){
return L->next == NULL;
} //返回链表长度,返回链表长度
int ListLength(LNode *L){
int len = ;
if(ListEmpty(L)) return ;
LNode *p = L->next;
while(p){
len++;
p = p->next;
}
return len;
} //获取第i个元素,将值保存到参数e中,返回是否获取的状态
int GetElem(LNode *L, int i, ElemType *e){
if(ListEmpty(L)){
printf("空链表\n");
return ;
}
LNode *p = L->next;
int j = ;
while(p && j<i){
p = p->next;
j++;
}
//i值不合法 >length 或者 <=0
if(!p||j>i) {
printf("获取元素的位置%d不合法\n", i);
return ;
}
*e = p->data;
printf("第%d个元素是%d\n",i,*e);
return ;
} //定位值为e的位置,返回指针指向节点
LNode* LocateElem(LNode *L, ElemType e){
LNode *p = L->next;
while(p && p->data!=e){
p = p->next;
}
return p;
} //查找值为e的前驱,返回前驱元素
ElemType PriorElem(LNode *L, ElemType cur_e){
LNode *p = L->next;
int idx = ;
while(p && p->data!=cur_e){
p = p->next;
idx++;
}
if(!p || idx>ListLength(L)){
printf("查不到此元素\n");
return cur_e;
}
ElemType e = NULL;
GetElem(L, idx-, &e);
if(e){
printf("%d的前驱是%d\n", cur_e, e);
}else{
printf("%d无前驱或获取元素的位置不合法\n",cur_e);
}
return e;
} //查找值为e的后继
ElemType NextElem(LNode *L, ElemType cur_e){
LNode *Locate = LocateElem(L, cur_e);
if(Locate && Locate->next){
printf("%d的后继是%d\n", cur_e, Locate->next->data);
}else{
printf("%d无后继或获取元素的位置不合法\n",cur_e);
}
return Locate->next->data;
} //插入元素
int ListInsert(LNode *L, int i, ElemType e){
LNode *p = L;
int j = ;
//指向要插入的前一个节点
while(p && (j<i-)){
p = p->next;
j++;
}
if(!p || j>i-){
printf("插入失败\n");
return ;}
LNode *nLNode = (LNode *)malloc(sizeof(LNode));
nLNode->data = e;
nLNode->next = p->next;
p->next = nLNode;
printf("插入成功\n");
return ;
} //删除第i个元素
int ListDelete(LNode *L, int i){
LNode *p = L;
LNode *q = NULL;
int j = ;
//指向要删除的前一个节点
while((p->next && (j<i-))){
p = p->next;
j++;
}
if(!(p->next) || (j>i-)){
printf("删除失败\n");
return ;
}
q = p->next; //q指向即将删除的节点
p->next = q->next;
free(q);
printf("删除成功\n");
return ;
} //遍历线性表
void TraverseList(LNode *L){
if(ListEmpty(L)){
printf("空链表");
return;
}
LNode *p = L->next;
while(p){
printf("%d ", p->data);
p = p->next;
}
printf("\n");
} int main(){
ElemType e = NULL;
LNode *L = NULL;
LNode *Locate = NULL;//用于定位查找到的节点 //初始化测试
L = InitList(L); //遍历测试
TraverseList(L); // //长度测试
// printf("线性表长度为%d\n", ListLength(L)); // //获取第i个元素测试
// GetElem(L, 1, &e);
// //非法操作
// GetElem(L, 999, &e); // //获取值为2的元素位置测试
// Locate = LocateElem(L, 2);
// if(Locate){
// printf("值为2的元素被Locate指向\n");
// }else{
// printf("没有值为2的元素被指向\n");
// } // //获取元素值为2的前驱测试
// PriorElem(L, 2);
// //非法操作
// GetElem(L, 1, &e);
// PriorElem(L, e); // //获取元素值为2的后继测试
// NextElem(L, 2);
// //非法操作
// GetElem(L, ListLength(L), &e);
// NextElem(L, e); // //插入元素测试
// printf("第3个位置插入999\n");
// ListInsert(L, 1, 999);
// TraverseList(L);
// //非法操作
// printf("第999位置插入999\n");
// ListInsert(L, 999, 999);
// TraverseList(L); // //删除元素测试
// printf("删除第3个位置\n");
// ListDelete(L, 3);
// TraverseList(L);
// //非法操作
// printf("删除第999位置\n");
// ListDelete(L, 999);
// TraverseList(L); // //清空链表测试
// ClearList(L);
// TraverseList(L); //销毁测试
L = DestroyList(L);
TraverseList(L);
printf("线性表长度为%d\n", ListLength(L)); }
纯C语言实现线性链表的更多相关文章
- 纯C语言实现线性表
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 typedef int ElemType; typedef ...
- 数据结构算法C语言实现(五)---2.3重新定义线性链表及其基本操作
一.简述 ...由于链表在空间的合理利用上和插入.删除时不需要移动等的优点,因此在很多场合下,它是线性表的首选存储结构.然而,它也存在着实现某些基本操作,如求线性表的长度时不如顺序存储结构的缺点:另一 ...
- javascript实现数据结构:线性表--线性链表(链式存储结构)
上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...
- C语言数据结构-创建链表的四种方法
结点类型: typedef int datatype; typedef struct NODE{ datatype data; struct NODE *next; }Node,*LinkList; ...
- 使用C语言实现线性表
线性表是最常用且最简单的一种数据结构.一个线性表是n个数据元素的有限序列,序列中的每个数据元素,可以是一个数字,可以是一个字符,也可以是复杂的结构体或对象.例如:1,2,3,4,5是一个线性表,A,B ...
- 学习使用C语言实现线性表
线性表是最常用且最简单的一种数据结构.一个线性表是n个数据元素的有限序列,序列中的每个数据元素,可以是一个数字,可以是一个字符,也可以是复杂的结 构体或对象.例如:1,2,3,4,5是一个线性表,A, ...
- 异想家纯C语言矩阵运算库
Sandeepin最近做的项目中需要在嵌入式芯片里跑一些算法,而这些单片机性能不上不下,它能跑些简单的程序,但又还没到上Linux系统的地步.所以只好用C语言写一些在高级语言里一个函数就解决的算法了, ...
- C语言实现单链表-03版
在C语言实现单链表-02版中我们只是简单的更新一下链表的组织方式: 它没有更多的更新功能,因此我们这个版本将要完成如下功能: Problem 1,搜索相关节点: 2,前插节点: 3,后追加节点: 4, ...
- C语言实现单链表-02版
我们在C语言实现单链表-01版中实现的链表非常简单: 但是它对于理解单链表是非常有帮助的,至少我就是这样认为的: 简单的不能再简单的东西没那么实用,所以我们接下来要大规模的修改啦: Problem 1 ...
随机推荐
- Centos7部署分布式文件存储(Fastdfs)
目录 FastDFS介绍 楼主目标:前可H5撩妹,后可Linux搞运维 环境:Centos7 软件: 软件链接: 安装前所有准备,上传软件到Centos7上的/opt的目录下 安装依赖软件和类库(安装 ...
- 数据库操作之DBUtils
概述 DBUtils是Java编程中的数据库操作实用工具,小巧简单实用. DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码. DBUtils三个核心功能介绍 QueryRunne ...
- Linux 配置Java环境
下载jdk安装包 安装Java环境之前,首先要到 官网下载地址 下载我们需要的jdk安装包,根据我们Linux系统的位数来选择需要下载的包,我的Linux是64位的,所以我下载的64位的jdk安装包. ...
- UE4 C++中出现的让人手足无措的问题(持续更新)
最近开始涉入UE4更深层的一面——UE4 C++,由于其中的体系和在课本或者是网课上那么说的C++体系有一些误差(准确说就是遵循的C++标准不同),导致学习与运用起来有些吃力,所以作此总结,为自己的开 ...
- Java后端面经总结:拿下蚂蚁金服美团头条 offer 秘诀
笔者在面过 猿辅导,去哪儿,旷视, 陌陌,头条, 阿里, 快手, 美团, 腾讯之后,除了收获一大堆面试问题,还思考到如何成为面试官眼中的”爱技术,爱思考,靠谱,有潜力候选人的”一些”套路”. 面试问题 ...
- SSM整合开发——基于SSM的OA系统
一.课程介绍 链接: https://pan.baidu.com/s/18B-lWfOUnKZPvuVEHY_NmQ 提取码: ky7t 复制这段内容后打开百度网盘手机App,操作更方便哦 需要 to ...
- Rust第一次综合练习
读取文件哈. 但分成了lib.rs和main.rs. 按文档上不行,自己胡乱的调通,但原理不熟悉. 里面的套路代码还是蛮多的. src/lib.rs use std::io::Read; use st ...
- C语言的常量
#include<stdio.h> int main(void) { ; //定义一个常量,不能被修改,可以赋初值:常量的标识符建议使用大写字母 ; //初始化 printf(" ...
- Flask框架之功能详解
1|0浏览目录 配置文件 路由系统 视图 请求相关 响应 模板渲染 session 闪现 中间件 蓝图(blueprint) 特殊装饰器 1|1配置文件 知识点 给你一个路径 "settin ...
- 生鲜超市项目错误及解决办法(crispy_forms、外键指向自己、class嵌套访问父类、meta类及各种字段参数)
为什么要在INSTALLED_APPS中加入crispy_forms? 因为django-crispy-forms 是对django form在html页面呈现方式进行管理的一个第三方插件. 为什么有 ...