链表-单向链表-值传递&地址传递

本文详细介绍了如何使用C++实现单向链表,包括节点定义、插入、删除等操作,并探讨了在链表操作中值传递与地址传递的区别和应用场景,帮助理解链表数据结构及指针、引用的使用技巧。
摘要由CSDN通过智能技术生成

1. 单向链表算法实现

typedef struct _Node{
 int number;
 char name[12];
 int age;
} Node;    // this is just a example

typedef struct _Link{
 Node node;
 struct _Link * Next;
} Link;

//add a node( current may be a head pointer
template<typename type>
void AddLinkNode(type * current, type * newNode);

//delete a node by idnumber
template<typename type, typename typeT>
void DeleteLinkNode(type* & head, typeT idNumber);

//iterator the link
template<typename type>
void Listview(type * head);

//add a node( current may be a head pointer
template<typename type>
void AddLinkNode(type * current, type * newNode)
{
 if (current == NULL)  // the current is the head pointer
  current = newNode;
 else    // non head pointer
  current->Next = newNode;
}

//iterator the link
template<typename type>
void Listview(type * head)
{
 type * p;
 for (p=head; p!=NULL; p = p->Next)
 {
  /*printf("%d %s %d", p->node.number, p->node.name, p->node.age);*/
  printf("%d ", p->node.number);
 }
}

template<typename type, typename typeT>
void DeleteLinkNode(type* & head, typeT idNumber)
{
 type * p = head;
 while (p!=NULL)
 {
  if (p->node.number == idNumber)
  {
   if (p==head) //the head pointer
   {
    head = p->Next;
    //printf("clean node----%d %s %d", head->node.number, head->node.name, head->node.age);
    free(p);  //clean the heap resource
    p = head; //make the p pointer to the next
   }
   else // non head pointer
   {
    //find the pre-pointer of p
    type * temp = head;
    while (temp->Next != p)
     temp =temp->Next;
    temp->Next = p->Next;
    free(p);  //clean the heap resource
    p = temp->Next; //make the p pointer to the next
   }
   //printf("delete node ---- %d ", p->node.number);
   //free(p);
   //break;
  }
  else
   p = p->Next; //put the pointer to the next
 }
}
2.  错误代码示例及分析

-----------------------------------------------this is the wrong code---------------------------------
//delete a node by idnumber
void DeleteLinkNode(Link * head, int idNumber)   // wrong here
{
 Link * p;
 for (p = head;  p!=NULL; p = p->Next)
 {
  if (p->node.number == idNumber)
  {
   if (p==head) //the head pointer
   {
    head = p->Next;
   }
   else // non head pointer
   {
    //find the pre-pointer of p
    Link * temp = head;
    while (temp->Next != p)
     temp =temp->Next;
    temp->Next = p->Next;
   }
   //printf("delete node ---- %d ", p->node.number);
   free(p);
   break;
  } 
 }
}
-------------------------------------------this is the wrong code-------------------------------------------

解释:
void DeleteLinkNode( Link * head,  int idNumber)                          -----------------(1)
template<typename type, typename typeT>
vo
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值