#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语言实现线性链表的更多相关文章

  1. 纯C语言实现线性表

    #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 typedef int ElemType; typedef ...

  2. 数据结构算法C语言实现(五)---2.3重新定义线性链表及其基本操作

    一.简述 ...由于链表在空间的合理利用上和插入.删除时不需要移动等的优点,因此在很多场合下,它是线性表的首选存储结构.然而,它也存在着实现某些基本操作,如求线性表的长度时不如顺序存储结构的缺点:另一 ...

  3. javascript实现数据结构:线性表--线性链表(链式存储结构)

    上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...

  4. C语言数据结构-创建链表的四种方法

    结点类型: typedef int datatype; typedef struct NODE{ datatype data; struct NODE *next; }Node,*LinkList; ...

  5. 使用C语言实现线性表

    线性表是最常用且最简单的一种数据结构.一个线性表是n个数据元素的有限序列,序列中的每个数据元素,可以是一个数字,可以是一个字符,也可以是复杂的结构体或对象.例如:1,2,3,4,5是一个线性表,A,B ...

  6. 学习使用C语言实现线性表

    线性表是最常用且最简单的一种数据结构.一个线性表是n个数据元素的有限序列,序列中的每个数据元素,可以是一个数字,可以是一个字符,也可以是复杂的结 构体或对象.例如:1,2,3,4,5是一个线性表,A, ...

  7. 异想家纯C语言矩阵运算库

    Sandeepin最近做的项目中需要在嵌入式芯片里跑一些算法,而这些单片机性能不上不下,它能跑些简单的程序,但又还没到上Linux系统的地步.所以只好用C语言写一些在高级语言里一个函数就解决的算法了, ...

  8. C语言实现单链表-03版

    在C语言实现单链表-02版中我们只是简单的更新一下链表的组织方式: 它没有更多的更新功能,因此我们这个版本将要完成如下功能: Problem 1,搜索相关节点: 2,前插节点: 3,后追加节点: 4, ...

  9. C语言实现单链表-02版

    我们在C语言实现单链表-01版中实现的链表非常简单: 但是它对于理解单链表是非常有帮助的,至少我就是这样认为的: 简单的不能再简单的东西没那么实用,所以我们接下来要大规模的修改啦: Problem 1 ...

随机推荐

  1. FCOS及其和Faster R-CNN的区别

    RetinaNet,SSD,YOLOv3,Faster R-CNN等都是Anchor-based的检测器,即需要预定义的Anchor boxes来进行训练.FCOS是一种Anchor-free和Pro ...

  2. robotframework + appium实例

    Open Application http://localhost:4723/wd/hub platformName=Android platformVersion=4.4.2 deviceName= ...

  3. 交互器中python中的帮助使用

    C:\Users\ceshi>pythonPython 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 64 b ...

  4. android主流开源自动化框架(monkeyrunner,robotium,uiautomator)转载

    摘要: android自动化框架小结:monkey,monkeyrunner,cts,robotium,uiautomator android自动化框架: Uiautomator: 优点:可以对所有操 ...

  5. http协议里定义的四种常见数据的post方法

    原文 https://blog.csdn.net/charlene0824/article/details/51199292 关于http协议里定义的四种常见数据的post方法,分别是: applic ...

  6. 在WEB显示实时视频流

    转载自:https://www.jianshu.com/p/7ef5490fbef7 安装摄像头 这里使用的是树莓派的官方摄像头,使用普通的 USB 摄像头也可以,但前提是你能够搞的定它的驱动. 大概 ...

  7. JS闭包—你不知道的JavaScript上卷读书笔记(二)

    关于闭包,初学者会被绕的晕头转向,在学习的路上也付出了很多精力来理解. 让我们一起来揭开闭包神秘的面纱. 闭包晦涩的定义 看过很多关于闭包的定义,很多讲的云里雾里,晦涩难懂.让不少人以为闭包是多么玄乎 ...

  8. CF888G XOR-MST 最小异或生成树

    CF888G XOR-MST 链接 CF888G 思路 trie上贪心,先左右两边连边,再用一条边的代价连起左右两颗树.因为内部的边一定比跨两棵树的边权笑,显然是对的. 代码自己瞎yy的.启发式合并 ...

  9. NOI2016优秀的拆分

    一种想法是枚举分割位置, 然后考虑前面部分有多少种可行的AA拆分方式, 后面部分有多少种可行的BB拆分方式, 然后乘法原理即可 那么问题是如何快速求出合法方案 解法是首先枚举长度len, 然后将序列分 ...

  10. [LeetCode] 525. Contiguous Array 相连的数组

    Given a binary array, find the maximum length of a contiguous subarray with equal number of 0 and 1. ...