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. 听说数据标注行业缺“中立”平台,京东金融竖起了大旗
  2. ReactJS入门之环境搭建以及编写HelloWorld程序
  3. Java语言学习概述
  4. AngularJS快速入门指南03:表达式
  5. edp1.2和edp1.4_EDP​​的完整形式是什么?
  6. 树莓派网页服务器的网页留言板,树莓派利用Django搭建聊天网页服务器 —— 准备篇...
  7. Eclipse安装Hibernate插件快速生成配置文件
  8. 算法竞赛中的输入输出框架
  9. Groovy 转换JSON和生产JSON
  10. git jenkins 子目录_在Jenkins中,如何将项目签出到特定目录(使用GIT)
  11. SQL Server 2005 技术内幕之T-SQL查询——逻辑查询处理(上)
  12. day16——oracle灾备2
  13. 动态服务器值 回放报错 没有关联到_LR之关联
  14. cass道路设计教程_(完整版)南方CASS7.1绘制道路断面图教程
  15. 石开kk高中计算机考试,石开KK电脑考试软件
  16. php 启用ereg,PHP 5.3的ereg / eregi替换
  17. 技术分享杂七杂八技术
  18. kail linux配置无线网络,Kali Linux 无线渗透测试入门指南 第一章 配置无线环境
  19. 嵌入式行业真的没有前途吗?
  20. datawindow技巧

热门文章

  1. paho MQTT C API接口描述
  2. MySQL为多种编程语言提供API_MySQL数据库C API(1)
  3. 上传图片 现实图片 读取图片
  4. 零基础编程——块语言编程游戏攻略之捉虫篇
  5. 用Ubuntu和RStudio Server搭建一个R语言的云平台
  6. Atomikos的使用过程中要注意的事
  7. layui登录php,Thinkphp6 + layui 实现后台登录(验证码刷新)
  8. 杂记——假设检验中p值的理解
  9. MySQL8.0使用教程
  10. 获取中国疫情数据并下载到本地