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