c 语言 单链表的操作 易考点
//头文件
#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 语言 单链表的操作 易考点相关推荐
- c语言单链表数据显示,C++_C语言单链表常见操作汇总,C语言的单链表是常用的数据结 - phpStudy...
#include #include //定义单链表结构体 typedef int ElemType; typedef struct Node { ElemType data; struct Node ...
- C语言一趟冒泡交换最小值,C语言单链表冒泡排序为啥以下代码实现不了?
struct node *sort(struct node *head)/*排序*/ { struct node *p,*q; struct node *temp; for(p=head;p!=NUL ...
- c语言单链表功能,[数据结构]单链表(C语言)的各种功能
06-03阅读200,000 + 链表是一种常见的基本数据结构,在此充分利用了结构指针. 链表可以动态存储和分配,即链表是一个功能非常强大的数组. 他可以在节点中定义多种数据类型,并可以根据需要随意添 ...
- C语言单链表基本操作总结
C语言单链表基本操作 本文是参考他人实现的C语言单链表,对多篇博文整理的结果,仅作为学习笔记.文末有参考出处. 1.单链表定义 链表是通过一组任意的存储单元来存储线性表中的数据元素,这些存储单 ...
- C语言单链表代码实现
C语言单链表代码实现 一.头文件.常量以及自定义数据结构 #include<stdio.h> #include<malloc.h> #include<stdlib.h&g ...
- C语言 单链表通讯录基础版实现,保证看完都直呼easy
C语言 单链表实现通讯录基础版,保证看完都大呼简单! --------------------------------- 首先在写通讯录之前,必须明确我们的需求: 因为是基础版,我在这里暂时只实现以下 ...
- C语言单链表初学容易掉的坑
C语言单链表初学容易掉的坑 结点的指针没有分配内存. 一个链表最基本的操作有建立.增加.删除.查找,几乎所有操作都离不开中间结点p.比如,建立时先检查是否空链表,若是,则令head指向结点p所指向的值 ...
- 单链表创建及代码实现对单链表的操作
链表:链表是一个有序的列表:是以节点的方式存储的,是链式存储:其中每一个节点包含data域,next域,next域指向下一个节点:链表的各个节点不一定是连续存放的:链表分带有头节点的链表和没有头节点的 ...
- C语言单链表实现19个功能完全详解
#include "stdafx.h" #include "stdio.h" #include <stdlib.h> #include " ...
最新文章
- 派工单系统 源码_「青鸟报修云」酒店设备报修管理系统
- 2017英国AI形势报告:认知鸿沟、新商业模式和当下的挑战
- 【Java框架】 Hibernate与Mybatis对比
- JVM 虚拟机图文详解!真香!秒懂!一点都不难!
- 二级c语言努力学可以过吗,考过计算机二级C语言一些感想和建议
- 未来的程序员都将在浏览器中编码!
- android 字体像素转换工具类_Android点9图机制及在聊天气泡中的应用
- 从Timer中学习优先队列的实现
- mysql 清理relay日志_mysql 清除relay-log文件方法
- matlab画条状图,使用Matlab画条形图
- 所有失去的都会以另一种方式归来
- 高德地图定位失败_常见问题
- 如何使用WPS从正文开始页码为1,而不是从目录开始?
- 如何去掉html中input的边框
- C语言源文件名为什么无效,scanf函数,想说输入不容易!----小话c语言(3)
- 下载iCloud照片/文件的正确姿势(亲测好使)
- Java SE 基本介绍上
- JSON的parse()方法
- 字节汽车商标被转让!字节跳动获得该商标
- linux qt 导入gl库,Ubuntu下QtOpenGL无法正常使用GLU库的解决方法