在关于链表中我写了链表操作的函数,包括创建一个空链表函数,按序号插入元素函数等,在这篇文章中将会写出链表的查找操作,按节点插入操作,删除节点操作等等,一些关于单链表的操作函数。
关于函数的介绍我就直接写在代码中了。。。
如果需要测试的话,只需将下面代码中的函数复制到关于链表这篇博客的代码中就可以测试了。
/*
********************************************************************************
** 模块名称 : 链表的操作函数
** 文件名称 : linklist2.c
** 开发环境 : Dev-C++
** 版 本 : V0.1
** 说 明 :
** 修改记录 :
** 版本号 日期 作者 说明
** V0.1 2015-10-07 holi create
**
** Email : holi2018@qq.com
********************************************************************************
*/
/** 引用头文件 *****************************************************************/
#include<stdio.h>
#include<stdlib.h>
/** 私有宏**********************************************************************/
#define ERROR 0
#define OK 1
/** 私有数据类型 ***************************************************************/
typedef struct Node{//定义链表节点
int data;
struct Node *next;
}Node, *pNode;
/** 私有函数声明 ***************************************************************/
Node *getElem(pNode *pHead, int i); //按序号查找节点
Node *locateElem(pNode *pHead, int e); //按值查找节点
int listInsertNode(Node *pRandomeNode, int e); //对某一节点进行前插操作
int listDeleteNode(Node *pRandomNode); //删除某一节点
int listLength(pNode *pHead); //求链表长度
pNode *reverseList(pNode *pHead); //将一个链表就地置逆
void rePrintList(pNode *pHead); //从尾到头打印链表
/** 私有函数 ******************************************************************/
/*
*********************************************************************************
** 函数名称: getElem
** 功能描述: 查找链表中第i个元素,返回i节点的指针
** 参 数: pNode *pHead, int i
** 返 回 值: Node *p
** 使用说明:
** 调用方法:
**********************************************************************************
*/
Node *getElem(pNode *pHead, int i){
int j = 1;
Node *p = (*pHead) -> next;
if(0 == i)
return *pHead;
if(i < 1)
return NULL;
while(NULL != p && j < i){
p = p -> next;
j++;
}
return p;
}
/*
*********************************************************************************
** 函数名称: locateElem
** 功能描述: 找出链表中第一个data域为e的节点,返回节点指针
** 参 数: pNode *pHead, int i
** 返 回 值: Node *p
** 使用说明:
** 调用方法:
**********************************************************************************
*/
Node *locateElem(pNode *pHead, int e){
Node *p = *pHead;
while(NULL != p && p -> data != e){
p = p -> next;
}
return p;
}
/*
*********************************************************************************
** 函数名称: listInsertNode
** 功能描述: 在*pRandomNode前进行插入元素为e的节点
** 参 数: Node *pRandomeNode ,int e
** 返 回 值: OK : 1 ERROR:0
** 说 明:实现思想是将该元素插入到节点的后面,然后在将两个节点的数据域交换
** 调用方法:
**********************************************************************************
*/
int listInsertNode(Node *pRandomNode, int e){
Node *p,*s;
int temp;
p = pRandomNode;
s = (Node*)malloc(sizeof(Node));
s -> data = e;
s -> next = p -> next;
p -> next = s;
temp = p -> data;
p -> data = s -> data;
s -> data = temp;
return OK;
}
/*
*********************************************************************************
** 函数名称: listDeleteNode
** 功能描述: 删除链表中的*pRandomeNode节点
** 参 数: Node *pRandomeNode
** 返 回 值: ERROR:0 OK:1
** 说 明:可以删除一个无头链表的节点
** 调用方法:
**********************************************************************************
*/
int listDeleteNode(Node *pRandomeNode){
Node *p ,*s;
p = pRandomeNode;
s = p -> next;
p -> data = p -> next -> data;
p -> next = s -> next;
free(s);
return OK;
}
/*
*********************************************************************************
** 函数名称: listLength
** 功能描述: 删除链表中的*pRandomeNode节点
** 参 数: pNode *pHead
** 返 回 值: int len
** 使用说明:
** 调用方法:
**********************************************************************************
*/
int listLength(pNode *pHead){
int len = 0;
Node *p = (*pHead)-> next;
while(NULL != p){
p = p -> next;
++len;
}
return len;
}
/*
*********************************************************************************
** 函数名称: reverseList
** 功能描述: 将一个链表就地置逆
** 参 数: pNode *pHead
** 返 回 值: pNode *pHead
** 使用说明:
** 调用方法:
**********************************************************************************
*/
pNode *reverseList(pNode *pHead){
Node *pre, *p = (*pHead)-> next, *r = p -> next;
p -> next = NULL; //处理第一个节点
while(r != NULL){
pre = p;
p = r;
r = r -> next ;
p -> next = pre;
}
(*pHead) -> next = p; //处理最后一个节点
return pHead;
}
/*
*********************************************************************************
** 函数名称: rePrintList
** 功能描述: 从未到头输出链表中每个节点的值
** 参 数: pNode *pHead
** 返 回 值: 无
** 使用说明:
** 调用方法:
**********************************************************************************
*/
void rePrintList(pNode *pHead){
if((*pHead) -> next -> next != NULL){
rePrintList(&((*pHead) -> next));
}
printf("%d ", (*pHead)-> next ->data);
}
“十一”假期的最后一天,祝愿全国人民节日快乐,因为今天是特殊的一天!!!