关于链表(二)

    在关于链表中我写了链表操作的函数,包括创建一个空链表函数,按序号插入元素函数等,在这篇文章中将会写出链表的查找操作,按节点插入操作,删除节点操作等等,一些关于单链表的操作函数。

    关于函数的介绍我就直接写在代码中了。。。

   如果需要测试的话,只需将下面代码中的函数复制到关于链表这篇博客的代码中就可以测试了。

/*
********************************************************************************                                   
** 模块名称 : 链表的操作函数 
** 文件名称 : 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);
} 
 
“十一”假期的最后一天,祝愿全国人民节日快乐,因为今天是特殊的一天!!! 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值