纯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 ... 
随机推荐
- Windows局域网共享遇到的问题
			前言 接这篇:Windows 局域网内共享 我们的环境: 共享机:局域网内某台主机 windows 7 x64 客户端:windows 7 /windows 10 (各版本系统都有) 可以使用共享人数 ... 
- 03导航链接的制作(wx:for循环)和小程序警告request fail url not in domain list
			06==>导航链接的制作 <!-- 导航链接 --> <navigator url="../list/list" hover-class="nav ... 
- 【洛谷P3756】[CQOI2017]老C的方块(最小割)
			洛谷 题意: 给出一个网格图类似于这样: 现在给出一个\(n*m\)大小的网格,之后会给出一些点,若某些点相连形成了如下的几个图案,那么就是不好的. 现在可以删去一些点,但删除每个点都有一些代价,问最 ... 
- pytest文档30-功能用例与自动化用例完美对接(allure)
			前言 做自动化做久了,经常会思考一个问题,到底别人是怎么做的自动化,跟自己的有啥不一样,看过不少书和资料,都是停留在demo的层面. 真正把自动化做的好的大牛又不屑于分享自己的劳动成果,所以大部分情况 ... 
- JS高阶---IIFE&&函数前加;
			IIFE( 立即调用函数表达式)是一个在定义时就会立即执行的 JavaScript 函数. 全称为Immediately Invoked Function Expression 有时如果不加:会出现一 ... 
- JS高阶---回调函数
			1.什么函数是回调函数? 此时两者的执行并没有先后顺序 两个都是回调函数 满足三个特点就是回调 .定义了函数 .没有主动调用 .最后执行了 2.常见的回调函数有哪些? .DOM事件回调函数 .定时器回 ... 
- 如何去掉任务栏的IE搜索栏
			在IE图标的位置单击鼠标右键,选择退出. 
- mysql版本引起的驱动问题
			mysql版本引起的驱动问题 com.mysql.jdbc.Driver 是 mysql-connector-java 5中的, com.mysql.cj.jdbc.Driver 是 mysql-co ... 
- 洛谷 P2357 守墓人
			洛谷 P2357 守墓人 题目描述 在一个荒凉的墓地上 有一个令人尊敬的守墓人, 他看守的墓地从来 没有被盗过, 所以人们很放心的把自己的先人的墓 安顿在他那 守墓人能看好这片墓地是必然而不是偶然.. ... 
- C++面向对象程序设计学习笔记(4)
			类与对象(2) string类 C++不仅向下兼容C的字符表示方法,也声明了一种更方便的字符串类型,即string类. 想要使用string类,必须包括头文件string,即要声明 #include& ... 
