//头文件
#ifndef __LINKLIST_H__#define __LINKLIST_H__
typedef int DataType;typedef struct LinkList
{DataType _data;struct LinkList* _next;
}LinkList,*pLinkList;void InitLinkList(pLinkList& pHead);
void PrintLinkList(pLinkList pHead);
int  GetListLength(pLinkList pHead);
void DestroyList(pLinkList& pHead);
void PushBack(pLinkList& pHead,DataType Data);
void PopBack(pLinkList& pHead);
void PushFront(pLinkList& pHead, DataType Data);
void BuyNode(pLinkList& pHead,DataType Data);
pLinkList Find(pLinkList pHead,DataType Data);
void Insert(pLinkList pos, DataType Data);
void Remove(pLinkList& pHead, DataType Data);
void RemoveAll(pLinkList& pHead, DataType Data);
void Erase(pLinkList& pHead, pLinkList pos);
void BubbleSort( pLinkList pHead);
int JosephusCircle(pLinkList pHead, int num);
void QuickSort(pLinkList pHead,pLinkList pEnd);
void ReverseList(pLinkList& pHead);
pLinkList IfCircleList(pLinkList pHead);pLinkList CircleListEntrance(pLinkList pHead);#endif//函数文件
#include<stdio.h>
#include"linklist.h"
#include<malloc.h>
#include<assert.h>//初始化节点
void InitLinkList(pLinkList& pNode)
{assert(pNode);pNode->_next = NULL;pNode->_data = 0;}
//遍历输出链表数据域
void PrintLinkList(pLinkList pHead)
{pLinkList tmp = pHead;if (pHead == NULL){printf("链表为空!\n");}while (tmp){printf("%d ", tmp->_data);tmp = tmp->_next;}printf("\n");
}
//求长度
int  GetListLength(pLinkList pHead)
{int length = 0;while (pHead){pHead = pHead->_next;++length;}return length;}
//销毁链表
void DestroyList(pLinkList& pHead)
{pLinkList del = pHead;if (pHead == NULL){printf("链表为空!\n");}while (pHead){del = pHead->_next;if (pHead->_next==NULL){free(pHead);pHead =NULL;return;}pHead->_next = pHead->_next->_next;free(del);}
}
//尾插
void PushBack(pLinkList& pHead,DataType Data)
{pLinkList tmp = pHead;if (pHead == NULL){BuyNode(pHead, Data);}else{while (tmp->_next){tmp = tmp->_next;}BuyNode(tmp->_next, Data);}}//尾删
void PopBack(pLinkList& pHead)
{pLinkList tmp = pHead;if (tmp == NULL){printf("链表已空!\n");return;}if (pHead->_next == NULL){free(pHead);pHead = NULL;return;}while (tmp->_next->_next!=NULL){tmp = tmp->_next;}free(tmp->_next);tmp->_next = NULL;
}
//头插
void PushFront(pLinkList& pHead, DataType Data)
{pLinkList tmp;BuyNode(tmp,Data);tmp->_next = pHead;pHead = tmp;
}
//创建节点
void BuyNode(pLinkList& pNode, DataType Data)
{pNode = (pLinkList)malloc(sizeof(LinkList));pNode->_data = Data;pNode->_next = NULL;
}
//查找
pLinkList Find(pLinkList pHead,DataType Data)
{pLinkList tmp = pHead;assert(pHead);while (tmp){if (tmp->_data == Data)return tmp;tmp = tmp->_next;}return NULL;
}
//中 后插
void Insert(pLinkList pos, DataType Data)
{assert(pos);pLinkList tmp = pos->_next;BuyNode(pos->_next, Data);pos->_next->_next = tmp;
}
//删除给定数据节点
void Remove(pLinkList& pHead, DataType Data)
{pLinkList del = Find(pHead, Data);pLinkList tmp = pHead;if (pHead == NULL){printf("链表为空!\n");return;}if (pHead == del){pHead = pHead->_next;free(tmp);return;}while (tmp->_next ){if (tmp->_next == del){tmp->_next = tmp->_next->_next;free(del);return;}tmp = tmp->_next;}
}//删除所有给定数据节点
void RemoveAll(pLinkList &pHead, DataType Data)
{pLinkList del = Find(pHead, Data);pLinkList tmp = pHead;if (pHead == NULL){printf("链表为空!\n");return;}while (tmp->_next&&del!=NULL){del = Find(pHead, Data);if (pHead == del){pHead = pHead->_next;free(tmp);tmp = pHead;}else if (tmp->_next== del){tmp->_next = tmp->_next->_next;free(del);}elsetmp = tmp->_next;}
}//删除位置节点
void Erase(pLinkList& pHead, pLinkList pos)
{pLinkList tmp = pHead;assert(pHead);assert(pos);if (pHead == pos){pHead = pHead->_next;return;}while (tmp){if (tmp->_next == pos){tmp->_next = tmp->_next->_next;free(pos);break;}tmp = tmp->_next;}}
//冒泡排序 升序
void BubbleSort(pLinkList pHead)
{pLinkList tmp = pHead,index=pHead;int count = 0;assert(pHead);while (index){tmp = pHead;while (tmp->_next){if ((tmp->_data) > (tmp->_next->_data)){DataType change = tmp->_data;tmp->_data = tmp->_next->_data;tmp->_next->_data = change;++count;}tmp = tmp->_next;}if (count <= 1)return;else{tmp = pHead;index = index->_next;}}
}
//约瑟夫环 假设链表为环 num=3
int JosephusCircle(pLinkList pHead, int num)
{pLinkList tmp = pHead;assert(pHead);while (tmp->_next!=tmp){pLinkList del = NULL;tmp = tmp->_next->_next;tmp->_data = tmp->_next->_data;del = tmp->_next;tmp->_next = tmp->_next->_next;free(del);}return tmp->_data;
}
//快排
void QuickSort(pLinkList pHead, pLinkList pEnd)
{pLinkList cur ;pLinkList prev = pHead;pLinkList key = pHead;DataType tmp = 0;if (pHead==NULL||pHead->_next==NULL){return;}cur = pHead->_next;if (pEnd == pHead->_next||pEnd==pHead){return;}while (cur!=pEnd){if (cur->_data < key->_data){prev = prev->_next;if (cur != prev){DataType tmp = cur->_data;cur->_data = prev->_data;prev->_data = tmp;}       }cur = cur->_next;}tmp = prev->_data;prev->_data = key->_data;key->_data = tmp;QuickSort(pHead, prev);QuickSort(prev->_next, pEnd);}
//逆置
void ReverseList(pLinkList& pHead)
{pLinkList NewHead = NULL;pLinkList tmp =NULL;if (!pHead || !pHead->_next)return;while (pHead){NewHead = pHead->_next;pHead->_next =tmp;tmp = pHead;  pHead = NewHead;}pHead = tmp;}
//判断单链表是否带环
pLinkList IfCircleList(pLinkList pHead)
{pLinkList fast = pHead;pLinkList slow = pHead;assert(pHead);while (fast&&fast->_next){fast = fast->_next->_next;slow = slow->_next;if (fast == slow){return fast;}}return NULL;
}
//判断环的入口点
pLinkList CircleListEntrance(pLinkList pHead)
{pLinkList head = pHead;pLinkList tmp = IfCircleList(pHead);if (pHead==NULL&&tmp==NULL){return NULL;}while (tmp != head){tmp = tmp->_next;head = head->_next;}return tmp;
}

转载于:https://blog.51cto.com/shaungqiran/1707791

c 语言 单链表的操作 易考点相关推荐

  1. c语言单链表数据显示,C++_C语言单链表常见操作汇总,C语言的单链表是常用的数据结 - phpStudy...

    #include #include //定义单链表结构体 typedef int ElemType; typedef struct Node { ElemType data; struct Node ...

  2. C语言一趟冒泡交换最小值,C语言单链表冒泡排序为啥以下代码实现不了?

    struct node *sort(struct node *head)/*排序*/ { struct node *p,*q; struct node *temp; for(p=head;p!=NUL ...

  3. c语言单链表功能,[数据结构]单链表(C语言)的各种功能

    06-03阅读200,000 + 链表是一种常见的基本数据结构,在此充分利用了结构指针. 链表可以动态存储和分配,即链表是一个功能非常强大的数组. 他可以在节点中定义多种数据类型,并可以根据需要随意添 ...

  4. C语言单链表基本操作总结

    C语言单链表基本操作     本文是参考他人实现的C语言单链表,对多篇博文整理的结果,仅作为学习笔记.文末有参考出处. 1.单链表定义 链表是通过一组任意的存储单元来存储线性表中的数据元素,这些存储单 ...

  5. C语言单链表代码实现

    C语言单链表代码实现 一.头文件.常量以及自定义数据结构 #include<stdio.h> #include<malloc.h> #include<stdlib.h&g ...

  6. C语言 单链表通讯录基础版实现,保证看完都直呼easy

    C语言 单链表实现通讯录基础版,保证看完都大呼简单! --------------------------------- 首先在写通讯录之前,必须明确我们的需求: 因为是基础版,我在这里暂时只实现以下 ...

  7. C语言单链表初学容易掉的坑

    C语言单链表初学容易掉的坑 结点的指针没有分配内存. 一个链表最基本的操作有建立.增加.删除.查找,几乎所有操作都离不开中间结点p.比如,建立时先检查是否空链表,若是,则令head指向结点p所指向的值 ...

  8. 单链表创建及代码实现对单链表的操作

    链表:链表是一个有序的列表:是以节点的方式存储的,是链式存储:其中每一个节点包含data域,next域,next域指向下一个节点:链表的各个节点不一定是连续存放的:链表分带有头节点的链表和没有头节点的 ...

  9. C语言单链表实现19个功能完全详解

    #include "stdafx.h" #include "stdio.h" #include <stdlib.h> #include " ...

最新文章

  1. 派工单系统 源码_「青鸟报修云」酒店设备报修管理系统
  2. 2017英国AI形势报告:认知鸿沟、新商业模式和当下的挑战
  3. 【Java框架】 Hibernate与Mybatis对比
  4. JVM 虚拟机图文详解!真香!秒懂!一点都不难!
  5. 二级c语言努力学可以过吗,考过计算机二级C语言一些感想和建议
  6. 未来的程序员都将在浏览器中编码!
  7. android 字体像素转换工具类_Android点9图机制及在聊天气泡中的应用
  8. 从Timer中学习优先队列的实现
  9. mysql 清理relay日志_mysql 清除relay-log文件方法
  10. matlab画条状图,使用Matlab画条形图
  11. 所有失去的都会以另一种方式归来
  12. 高德地图定位失败_常见问题
  13. 如何使用WPS从正文开始页码为1,而不是从目录开始?
  14. 如何去掉html中input的边框
  15. C语言源文件名为什么无效,scanf函数,想说输入不容易!----小话c语言(3)
  16. 下载iCloud照片/文件的正确姿势(亲测好使)
  17. Java SE 基本介绍上
  18. JSON的parse()方法
  19. 字节汽车商标被转让!字节跳动获得该商标
  20. linux qt 导入gl库,Ubuntu下QtOpenGL无法正常使用GLU库的解决方法

热门文章

  1. SDNU 1263.C语言程序设计教程(第三版)课后习题10.5(约瑟夫环)
  2. primer3批量设计引物
  3. Robberies HDU - 2955
  4. 数据库连接配置策略和实践
  5. Kotlin的高阶函数和常用高阶函数
  6. 针对双系统ubuntu16.04卡死及系统没有声音解决方法
  7. eclipse查看jar包中class的中文注释乱码问题的解决
  8. Docker存储驱动之OverlayFS简介
  9. PHP中常见的提示对照表
  10. input文本框设置和移除默认值