C语言不带头结点的单链表

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>typedef struct node {struct node* next;int data;
} Lnode, * LinkList;//初始化(不带头节点的单链表)
//如果头指针不是空,则置为空
void initSingleLinkList(Lnode* head) {if (head){head = NULL;}
}//链表的销毁(不带头节点的单链表)
void destroy(Lnode* L) {Lnode* p;while (L != NULL){p = L;L = L->next;free(p);}
}//清空链表中所有的元素
void clear(Lnode* L) {Lnode* p = L->next;Lnode* q;while (p != NULL){q = p;p = p->next;free(q);}L->data = NULL;L->next = NULL;
}//不带头节点的单链表,头插法
void headInsert(LinkList* L, int e) {Lnode* pNode = (Lnode*)malloc(sizeof(Lnode));pNode->data = e;pNode->next = *L;*L = pNode;
}//不带头节点的单链表,尾插法
//这里是通过遍历链表到最后一个节点,然后在最后一个节点后面插入新的节点
//也可以通过维护一个尾指针,直接利用尾指针插入新的节点,再维护尾指针
void tailInsert(LinkList* L, int e) {Lnode* pNode = (Lnode*)malloc(sizeof(Lnode*));pNode->data = e;pNode->next = NULL;if (!L){*L = pNode;}else{Lnode* p = *L;while (p->next){p = p->next;}p->next = pNode;}
}//链表的遍历输出
void show(Lnode* L) {if (!L){printf("L为空\n");return;}else{Lnode* p = L;int i = 0;while (p){printf("链表中的第%d个元素是%d\n", i++, p->data);p = p->next;}}
}//判断链表是否包含某个元素
bool contains(Lnode* L, int e) {if (!L){return false;}else{Lnode* p = L;while (p){if (p->data == e) {return true;}p = p->next;}return false;}
}//删除链表中的某个元素(第一次出现的目标元素节点)
bool delete(Lnode* L, int e) {if (!L){return false;}else if (L->data == e){L = L->next;}else{Lnode* p = L->next;Lnode* q = L;while (p){if (p->data == e){q->next = p->next;free(p);return true;}q = p;p = p->next;}}
}//删除第i个位置的节点,返回删除节点的数据域
bool deleteIndex(LinkList* L, int index,int* e) {if (! (*L) || index < 0){*e = -1;return false;}//如果删除的是首元节点,首元节点后无节点,则链表为空,有节点,则下一个节点为首元节点if (*L && index == 0) {if (!(*L)->next){*e = (*L)->data;free(L);return true;}else{*e = (*L)->data;Lnode* p = (*L);(*L) = (*L)->next;free(p);return true;}}//如果删除的是中间的普通节点,则需要将该节点的前驱节点的next指向该节点的后一个节点Lnode* p = *L;int i = 0;while (p->next){if (i == index-1){*e = p->next->data;p->next = p->next->next;return true;}i++;p = p->next;}*e = -1;return false;//如果删除的是尾节点,则不需要将尾节点的前一个节点的next域指向尾节点的后一个节点
}//链表中元素的个数
int  size(Lnode* L) {if (!L){Lnode* p = L;int i = 0;while (!p){i++;p = p->next;}return i;}return -1;
}//链表的逆序
Lnode* reversedAtNode(LinkList* head, Lnode* pNode) {if (pNode->next == NULL){*head = pNode;}else{(reversedAtNode(head, pNode->next))->next = pNode;pNode->next = NULL;}return pNode;
}
void reversed(LinkList* L) {if (size(L) == 0){return;}reversedAtNode(L, *L);
}void main() {Lnode* head = NULL;initSingleLinkList(head);for (int i = 0; i < 5; i++){headInsert(&head, i);}show(head);for (int i = 5; i < 10; i++){tailInsert(&head, i);}show(head);//判断链表中是否包含元素eif (contains(head, 3)) {printf("包含元素%d\n", 3);}else{printf("不包含元素%d\n", 3);}//删除第一次出现在链表中的元素为e的节点printf("测试删除==========\n");delete(head, 3);show(head);//删除链表中第index的元素,返回数据与printf("测试删除第index的节点==========\n");int resDel;deleteIndex(&head, 8, &resDel);printf("被删除的是%d\n", resDel);show(head);//测试链表的逆转printf("测试链表的逆转=======\n");show(head);printf("=================start\n");reversed(&head);show(head);
}

C语言不带头结点的单链表相关推荐

  1. c语言带头节点单链表创建,C语言建立带头结点的单链表

    满意答案 TS老妹儿 2017.08.31 采纳率:57%    等级:9 已帮助:1719人 单链表的生成有2种方式:头插法和尾插法. 1.头插法/************************* ...

  2. C语言实现不带头结点的单链表逆置的三种方法

    C语言实现不带头结点的单链表逆置的三种方法 直接循环 头插法 递归法 END! 直接循环 图片解释 ListNode* ReverseList1(ListNode *head) {if(head == ...

  3. 2.3 带头结点的单链表:理论+编程实战(C语言详细)

    1.顺序存储:线性表/栈/队列:理论+C语言实现–详细 2.1 链式存储概述 和 2.2 线性表的链式存储–单链表(C语言详细实现) 文章目录 2.3 带头结点的单链表 1. 带头结点的单链表基本概念 ...

  4. c语言实现--不带头结点的单链表操作

    1,不带头结点的单链表操作中,除了InitList(),GetElem(),ListInsert(),ListDelete()操作与带头结点的单链表有差别外,其它的操作基本上一样. 2,不带头结点单链 ...

  5. 【C语言】数据结构C语言版 实验3 带头结点的单链表

    slnklist.h #include <stdio.h> #include <stdlib.h> /************************************* ...

  6. 【C语言】数据结构C语言版 实验2 不带头结点的单链表

    运行环境:Dev-C++ vs2013可能不能运行 首先新建一个头文件slnklist.h #include <stdio.h> #include <stdlib.h> /** ...

  7. 不带头结点的单链表c语言,数据结构:C语言实现----不带头结点单链表总结

    不带头结点的单链表结构体声明 typedef struct Node { int data; struct Node *next; }Node, *LinkList; (1)初始化 void Init ...

  8. 带头结点的单链表的初始化,建立,插入,查找,删除

    //带头结点的单链表的初始化,建立,插入,查找,删除     #include <stdio.h>     #include <stdlib.h> typedef int El ...

  9. 头指针为head的带头结点的单链表判空条件head->next==null?

    由于考研需求,又乖乖滚回来捧起数据结构了,一年没碰书,忘得都差不多了,还得捡回来,哭死了. 进入正题,为何头指针为head的带头结点的单链表判空条件head->next==null?其实一开始这 ...

最新文章

  1. whoami,who,w命令详解
  2. java相对目录_java相对目录和绝对目录解析
  3. mysql连接失败 ping通_哭~问:oracle 数据库有时会突然连接失败,但能ping通主机...
  4. ASP.NET Core Web API 与 SSL
  5. 那些功能逆天,却鲜为人知的pandas骚操作
  6. 块编码、对象编码、小波编码、分布式编码【转贴】
  7. 程序员面试金典 - 面试题 04.04. 检查平衡性(二叉树高度)
  8. java网络编程1、2章习题
  9. 万网空间的数据库配置方法
  10. ubuntu解决安装Scrapy库时报x86_64-linux-gnu-gcc错误
  11. 表必须要有主键吗_玄关隔断什么材质好?玄关隔断必须要做吗
  12. python websocket爬虫_python根据websocket抓取斗鱼弹幕和礼物消息
  13. 5G助推直播行业快速发展
  14. 详解Mysql执行计划explain
  15. 换新电脑后怎么重装系统win7,win7安装教程
  16. 常用SEISMIC BINARY数据的读取
  17. 超详细的商业智能BI知识分享,值得收藏
  18. 6.PCIe协议分析3-PCIe TLP包详解2
  19. 相片打印机原理_激光照片打印机的原理 为什么很少人用激光照片打印机打印照片...
  20. 单片机之动态数码管篇

热门文章

  1. 最简单版B站视频下载
  2. 如何把一个长链接变成短链接?
  3. 笔记本电脑查看几个卡槽,支持最大内存,内存条参数详细步骤,开启双通道条件
  4. 深度干货 | 32道JVM基础面试题 (1.2W字详细解析)
  5. pip install pygame无法下载的解决方案
  6. python图书管理系统基本增删改查函数实现
  7. 舜宇光学科技2018年净利润达24.9亿元 同比减少14.2%
  8. Unity3D-高通AR-《狼来了》-6地平面AR及最后发布Android App
  9. c语言程序设计课题为车票管理系统,c语言 班级成管理系统.doc
  10. oracle 序列递增更新,ORACLE自动递增--序列