带有头结点的链表的基本操作
时间:2022-04-26
本文章向大家介绍带有头结点的链表的基本操作,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
#ifndef _LIST_h_
#define _LIST_h_
//链表中的数据结构
typedef struct Link_data
{
int a;
int b;
}Node_data;
//链表节点结构
typedef struct Link_node
{
Node_data data;
struct Link_node *pNext;
}Node;
Node* CreateList(void);
Node* FindNodeByGlobalIndex(Node *pHead, int iGlobalIndex);
Node* Insert2ListTail(Node *pHead, Node_data *pAutoInfo);
int RemoveList(Node *pHead);
void PrintList(Node *pHead);
int DeleteList (Node *pHead,int x);
void ReverseList(Node *pHead);
void SortList(Node *pHead);
#endif
#include <string.h>
#include <malloc.h>
#include<stdio.h>
#include"list.h"
/*************************************************
Function : CreateList
Description : 创建链表头节点
Return : 链表的头指针
*************************************************/
Node* CreateList(void)
{
Node *pHead = NULL;
//申请的头指针
pHead = (Node *)malloc(sizeof(Node));
//判断是否申请成功
if (NULL == pHead)
{
return NULL;
}
//针对具体结构进行初始化
pHead->data.a = 0;
pHead->data.b = 0;
pHead->pNext = NULL;
return pHead;
}
/*************************************************
Function : FindNodeByGlobalIndex
Description : 根据指定参数,查找某个节点
Input : pHead 链表的头节点指针
要查找的学生ID
Return : 正确:返回指定节点的指针
失败:返回空指针
*************************************************/
Node* FindNodeByGlobalIndex(Node *pHead, int iGlobalIndex)
{
Node *pNode = NULL;
if ((NULL == pHead) || (iGlobalIndex < 0))
{
return NULL;
}
pNode = pHead->pNext;
while ((NULL != pNode))
{
if (pNode->data.a == iGlobalIndex)
{
break;
}
pNode = pNode->pNext;
}
return pNode;
}
/*************************************************
Function : Insert2ListTail
Description : 向链表中尾部插入某个节点
Input : pHead 链表的头节点指针
pStudentInfo 学生信息
Return : 正确:返回头节点指针
失败:返回空指针
*************************************************/
Node* Insert2ListTail(Node *pHead, Node_data *pAutoInfo)
{
Node* pNode = NULL;
Node* pNewNode = NULL;
if ((NULL == pHead) || (NULL == pAutoInfo))
{
return NULL;
}
pNode = pHead;
while (pNode->pNext != NULL)
{
pNode = pNode->pNext;
}
pNewNode = (Node *)malloc(sizeof(Node));
if (NULL == pNewNode)
{
return NULL;
}
pNode->pNext = pNewNode;
pNewNode->pNext = NULL;
memcpy(&(pNewNode->data), pAutoInfo, sizeof(Node_data ));
return pHead;
}
/*************************************************
Function : RemoveList
Description : 删除整个链表
Input : pHead 链表的头节点指针
Return : 正确: 1
失败: 0
*************************************************/
int RemoveList(Node *pHead)
{
Node *pNode = NULL;
Node *pb = NULL;
if (NULL == pHead)
{
return 0;
}
pNode = pHead;
pb = pNode->pNext;
if (NULL == pb)
{
free(pNode);
}
else
{
while (NULL != pb)
{
free(pNode);
pNode = pb;
pb = pb->pNext;
}
free(pNode);
}
pNode = NULL;
return 1;
}
/*************************************************
Function : PrintList
Description : 打印整个链表
Input : pHead 链表的头节点指针
Return :
*************************************************/
void PrintList(Node *pHead)
{
Node *pNode = NULL;
if (NULL == pHead)
{
return ;
}
pNode = pHead->pNext;
while ((NULL != pNode))
{
printf("rn a is %d b is %d",pNode->data.a,pNode->data.b);
pNode = pNode->pNext;
}
return ;
}
/*************************************************
Function : DeleteList
Description : 删除链表的一个结点,删除条件该节点的a值与x相同
Input :
Return :
*************************************************/
int DeleteList (Node *pHead,int x)
{
Node *pNode = NULL;
Node *pre = NULL;
if (NULL == pHead )
{
return 0;
}
pNode = pHead->pNext;
pre = pHead;
while(pNode)
{
if(pNode->data.a == x)//删除条件
{
pre->pNext = pNode->pNext;
free(pNode);
return 1;
}
else
{
pre = pNode;
}
pNode = pNode->pNext;
}
return 0;
}
/*************************************************
Function : ReverseList
Description : 链表反转
Input :
Return :
*************************************************/
void ReverseList(Node *pHead)
{
Node* p = pHead->pNext;
Node* q = p->pNext;
Node* t = NULL;
if(NULL == pHead || NULL == pHead->pNext)
{
return;
}
while(NULL != q)
{
t = q->pNext;
q->pNext = p;
p = q;
q = t;
}
pHead->pNext->pNext = NULL;
pHead->pNext = p;
}
/*************************************************
Function : SortList
Description : 按a值排序
Input :
Return :
*************************************************/
void SortList(Node *pHead)
{
Node* pi = pHead->pNext;
Node* pj = pi->pNext;
Link_data temp;
memset(&temp,0,sizeof(Link_data));
if(NULL == pHead || NULL == pHead->pNext)
{
return;
}
for(;pi != NULL;pi=pi->pNext)
{
for(pj = pi->pNext;pj != NULL;pj=pj->pNext)
{
if(pj->data.a < pi->data.a)
{
temp = pj->data;
pj->data = pi->data;
pi->data = temp;
}
}
}
}
#include<stdio.h>
#include<string.h>
#include"list.h"
Node * g_LinkHead = NULL;
int main()
{
Node_data data1;
Node_data data2;
Node_data data4;
Node *data3 = NULL;
memset(&data1, 0, sizeof(Node_data));
memset(&data2, 0, sizeof(Node_data));
memset(&data4, 0, sizeof(Node_data));
data1.a=3;
data1.b=3;
data2.a=2;
data2.b=4;
data4.a=5;
data4.b=6;
g_LinkHead=CreateList();
Insert2ListTail(g_LinkHead,&data1);
Insert2ListTail(g_LinkHead,&data2);
Insert2ListTail(g_LinkHead,&data4);
PrintList(g_LinkHead);
//data3 = FindNodeByGlobalIndex(g_LinkHead, 2);
//printf("rn data3.a %d data3.b %d",data3->data.a,data3->data.b);
printf("nn");
//(void) ReverseList(g_LinkHead);
(void) SortList(g_LinkHead);
PrintList(g_LinkHead);
/*if(DeleteList (g_LinkHead,4))
{
PrintList(g_LinkHead);
}
PrintList(g_LinkHead);*/
/*if(RemoveList(g_LinkHead))
{
g_LinkHead = NULL;
}
PrintList(g_LinkHead);*/
return 0;
}
- Selenium2+python自动化71-多个浏览器之间的切换
- 总结:JDK1.5-JDK1.8各个新特性
- hihoCoder #1094 : Lost in the City(枚举,微软苏州校招笔试 12月27日 )
- HDU 2563 统计问题(递归,思维题)
- python接口自动化9-https请求(SSL)
- Windows环境下php开启GD库的方法
- python接口自动化10-token登录
- HDU 1000 A + B Problem(指针版)
- Java 10 已发布!时隔 6 月带来 109 项新特性
- STL中的nth_element()方法的使用
- C++queue容器学习(详解)
- 牛客面经 |这可能不只是一篇面经
- 图的基本算法(BFS和DFS)
- C++STL中set的使用策略(详解)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- R语言用多重插补法估算相对风险
- R语言分析协变量之间的非线性关系
- stata如何处理结构方程模型(SEM)中具有缺失值的协变量
- stata对包含协变量的模型进行缺失值多重插补分析
- 互联网直播点播平台go语言搭建重定向和反向代理的区别及使用
- UNIX时间戳和北京时间的相互转换
- R语言对苏格兰独立民意调查的Meta分析
- 案例:归档自动清理脚本失效及连带影响
- R语言中固定与随机效应Meta分析 - 效率和置信区间覆盖
- R语言使用 LOWESS技术图分析逻辑回归中的函数形式
- R语言在逻辑回归中求R square R方
- R语言Poisson回归的拟合优度检验
- R语言ROC曲线下的面积-评估逻辑回归中的歧视
- 东芝MCU实现位带操作
- 单向链表的一点儿感悟