纯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 ...
随机推荐
- nacos 实现同机器上启动三个服务
1.我们要在单台服务器上启动多个nacos实例,保证三个不同的端口,我们可以通过修改启动脚本: 打开启动脚本找到:export FUNCTION_MODE="all" 这一行 ...
- Arbitrage POJ - 2240
题目链接:https://vjudge.net/problem/POJ-2240 思路:判正环,Bellman-ford和SPFA,floyd都可以,有正环就可以套利. 这里用SPFA,就是个板子题吧 ...
- 201871010123-吴丽丽 《面向对象程序设计(Java)》第十四周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- 201871010132--张潇潇--《面向对象程序设计(java)》第十二周学习总结
博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...
- 关于setImageURI out of memory的一些解决办法
http://stackoverflow.com/questions/477572/strange-out-of-memory-issue-while-loading-an-image-to-a-bi ...
- 使用Python获取图片的物理尺寸(KB)
如何获取图片的物理尺寸,而非(width, height)? #! -*- coding: utf-8 -*- import requests import io url = "https: ...
- RGB颜色查询
RGB颜色速查表 #FFFFFF #FFFFF0 #FFFFE0 #FFFF00 #FFFAFA #FFFAF0 #FFFACD #FFF8DC #FFF68F ...
- Centos7下搭建NFS服务器与连接详解
一,环境介绍 本实验使用了两台centos7虚拟机,其中 服务器:192.168.1.188 客户端:192.168.1.189 二,实验步骤 192.168.1.1 ...
- Redis面试题(46题)
1.什么是Redis?简述它的优缺点? Redis 的全称是:Remote Dictionary.Server,本质上是一个 Key-Value 类型的内存数据库,很像memcached,整个数据库统 ...
- [LeetCode] 364. Nested List Weight Sum II 嵌套链表权重和之二
Given a nested list of integers, return the sum of all integers in the list weighted by their depth. ...