C++中的引用方法

引用——定义别名,

int count1 = 0;int &count2 = count1;//用在变量定义void Swap(int&a, int&b)//用在函数形式参数定义{ int tmp = a; a = b; b = tmp;}

从下文的例子中可以看出采用“引用”方法在函数实现的时候更加方便简单

void PushBack(SListNode **ppHead, DataType x){ assert(ppHead); if (*ppHead == NULL) {  *ppHead = _BuyNode(x); } else {  SListNode *tail = *ppHead;  while (tail!=NULL)  {   tail = tail->next;  }  tail = _BuyNode(x); }}void PushBack(SListNode* &pHead, DataType x)//使用引用 定义别名的方法实现尾插{ //不需断言 if (pHead == NULL) {  pHead = _BuyNode(x); } else {  SListNode *tail = pHead;  while (tail->next != NULL)  {   tail = tail->next;  }  tail->next = _BuyNode(x); }}

//**********SListNode.h****************#pragma once#ifndef __SLISTNODE_H__#define __SLISTNODE_H__//--------添加头文件-----------#include
#include
#include
//--------链表结构------------typedef int DateType;  //定义数据类型为 inttypedef int DataType;typedef struct SListNode{ DataType data; struct SListNode *next;}SListNode;//--------函数-------------void PrintNode(SListNode *&pHead);//打印链表void PushBack(SListNode* &pHead, DataType x);//使用引用 定义别名的方法实现尾插void PushBack_p(SListNode **ppHead, DataType x);void PopBack(SListNode* &pHead);//尾删void PushFront(SListNode* &pHead, const DataType x);//头插void PopFront(SListNode* &pHead);//头删SListNode* Find(SListNode* pHead, const DataType x);//寻找data为x的结点void Insert(SListNode* pos, const DataType x);//在pos处插入新结点void Erase(SListNode*&pHead,SListNode* pos);//删除pos位置的结点(删除pos前的节点,删除pos位置结点更好的方法在下一篇博客论述)#endif   //__SLISTNODE_H__//***********SListNode.cpp****函数实现*******#include"SListNode.h"SListNode *_BuyNode(DataType x)//开辟新结点{ SListNode *tmp = (SListNode *)malloc(sizeof(SListNode)); tmp->data = x; tmp->next = NULL; return tmp;}void PushBack_p(SListNode **ppHead, DataType x){ assert(ppHead); if (*ppHead == NULL) {  *ppHead = _BuyNode(x); } else {  SListNode *tail = *ppHead;  while (tail!=NULL)  {   tail = tail->next;  }  tail = _BuyNode(x); }}void PushBack(SListNode* &pHead, DataType x)//使用引用 定义别名的方法实现尾插{ //不需断言 if (pHead == NULL) {  pHead = _BuyNode(x); } else {  SListNode *tail = pHead;  while (tail->next != NULL)  {   tail = tail->next;  }  tail->next = _BuyNode(x); }}void PopBack(SListNode* &pHead)//尾删 { //不需断言 //注意 空、一个节点 、多个节点三种情况 if (pHead == NULL) {  printf("SListNode is NULL\n");  return; } if (pHead->next == NULL) {  free(pHead);  pHead = NULL; } else {  SListNode *tail = pHead;  while (tail->next->next != NULL)  {   tail = tail->next;  }  free(tail->next);  tail->next = NULL; }}void PushFront(SListNode* &pHead, const DataType x)//头插{ //无需断言 if (pHead == NULL) {  pHead = _BuyNode(x); } else {  SListNode *tmp = _BuyNode(x);  tmp->next = pHead;  //针对没有头结点的情况  pHead = tmp; }}void PopFront(SListNode* &pHead)//头删{ //不需断言 //注意 空、多个节点三种情况 if (pHead == NULL) {  printf("SListNode is NULL\n");  return; } else {  SListNode *head = pHead->next;  free(pHead);  pHead = head; }}SListNode* Find(SListNode* pHead, const DataType x){ assert(pHead); SListNode*tmp = pHead; while (tmp != NULL) {  if (tmp->data == x)   return tmp;  tmp = tmp->next; } printf("%d 不在此链表中\n", x); return NULL; }void Insert(SListNode* pos, const DataType x)//在pos后插入新结点{ if (pos == NULL) {  pos = _BuyNode(x); } else {  SListNode* tmp = _BuyNode(x);  tmp->next = pos->next;  pos->next = tmp; }}void Erase(SListNode*&pHead, SListNode* pos)//删除pos位置后面的一个元素{ //考虑 空、 首元结点、 非首元结点、 不存在pos位置 assert(pHead); assert(pos); if (pHead == pos) {  pHead = pHead->next;  free(pos); } SListNode* prev = pHead; while (prev) {  if (prev->next == pos)  {   prev->next = pos->next;   free(pos);   pos = NULL;   break;  }  prev = prev->next; } return;}void PrintNode(SListNode *&pHead){ SListNode *tmp = pHead; while (tmp) {  printf("%d->", tmp->data);  tmp = tmp->next; } printf("NULL\n");}//***********test.cpp****************#define _CRT_SECURE_NO_WARNINGS#include"SListNode.h"void Test1()  //PushBack\PopBack{ printf("//Test1() PushFront/PopFront\n"); SListNode *LL = NULL; PushBack(LL, 1); PushBack(LL, 2); PushBack(LL, 3); PushBack(LL, 4); PrintNode(LL); PopBack(LL); PrintNode(LL); PopBack(LL); PrintNode(LL); PopBack(LL); PrintNode(LL); PopBack(LL); PrintNode(LL); PopBack(LL); PrintNode(LL);}void Test2()//PushFront\PopFront{ printf("//Test2() PushFront/PopFront\n"); SListNode *LL = NULL; PushFront(LL, 1); PushFront(LL, 2); PushFront(LL, 3); PushFront(LL, 4); PrintNode(LL); PopFront(LL); PrintNode(LL); PopFront(LL); PrintNode(LL); PopFront(LL); PrintNode(LL); PopFront(LL); PrintNode(LL); PopFront(LL); PrintNode(LL);}void Test3(){ printf("//Test3() Insert/Erase \n"); SListNode *LL = NULL; PushBack(LL, 1); PushBack(LL, 2); PushBack(LL, 4); PushBack(LL, 5); PrintNode(LL); Insert(LL, 0); PrintNode(LL); Insert(Find(LL, 5), 6); PrintNode(LL); Insert(Find(LL, 2), 3); PrintNode(LL); Erase(LL, Find(LL, 6)); PrintNode(LL); Erase(LL, Find(LL, 0)); PrintNode(LL); Erase(LL, Find(LL, 1)); PrintNode(LL); Erase(LL, Find(LL, 5)); PrintNode(LL); Erase(LL, Find(LL, 2)); PrintNode(LL); Erase(LL, Find(LL, 4)); PrintNode(LL); Erase(LL, Find(LL, 6));//当出现链表中不存在的元素Fine函数会返回NULL, //Erase函数第二个参数为NULL,断言assert检测到会返回错误 PrintNode(LL); Erase(LL, Find(LL, 3)); PrintNode(LL); free(LL);}int main(){ //Test1(); //Test2(); Test3(); system("pause"); return 0;}

在Erase(LL, Find(LL, 6));处插入断点