链表理论
代码实现
#include <iostream>
#include <string>
using namespace std;
//链表小节点
struct LinkNode
{
LinkNode *next;
};
//定义函数指针
typedef bool (*CompareNode)(LinkNode *node1,LinkNode *node2);
typedef void (*PrintNode)(LinkNode *node);
//链表
struct LinkList
{
LinkNode *head;
int size;
LinkList();
~LinkList();
//插入节点
void insertNode(int index,LinkNode *node);
//删除节点
void deleteNode(int index);
//查找节点
int queryNode(LinkNode *node,CompareNode compareNode);
//遍历链表
void printLinkList(PrintNode printNode);
//清空链表
void clearLinkList();
};
//数据节点
struct Person
{
LinkNode node;
string name;
int age;
Person(string name,int age);
};
void printNode(LinkNode *node)
{
//转换回原来的类型
Person *p=(Person*)node;
cout<<p->name<<" "<<p->age<<endl;
}
bool compareNode(LinkNode *node1,LinkNode *node2)
{
//转换回原来的类型
Person *p1=(Person*)node1;
Person *p2=(Person*)node2;
if((p1->name).compare(p2->name)==0 && p1->age==p2->age)
{
return true;
}
return false;
}
LinkList::LinkList()
{
head=new LinkNode;
head->next=NULL;
size=0;
}
LinkList::~LinkList()
{
delete head;
}
void LinkList::insertNode(int index, LinkNode *node)
{
if(index<0 || index>size)
{
index=size;
}
//辅助指针
LinkNode *pCurrent=head;
//将辅助指针移动到指定位置
for(int i=0;i<index;i++)
{
pCurrent=pCurrent->next;
}
//在指定位置插入节点
node->next=pCurrent->next;
pCurrent->next=node;
//更新链表大小
size++;
}
void LinkList::deleteNode(int index)
{
if(index<0 || index>size)
{
return;
}
//辅助指针
LinkNode *pCurrent=head;
//将辅助指针移动到指定位置
for(int i=0;i<index;i++)
{
pCurrent=pCurrent->next;
}
//在指定位置删除节点
pCurrent->next=pCurrent->next->next;
//更新链表大小
size--;
}
int LinkList::queryNode(LinkNode *node, CompareNode compareNode)
{
//辅助指针
LinkNode *pCurrent=head->next;
int i=0;
while (pCurrent != NULL)
{
//一旦找到直接返回位置
if(compareNode(pCurrent,node))
{
return i;
}
pCurrent=pCurrent->next;
i++;
}
//没找到返回-1
return -1;
}
void LinkList::printLinkList(PrintNode printNode)
{
//辅助指针
LinkNode *pCurrent=head->next;
while (pCurrent != NULL)
{
//逐个使用用户自定义函数遍历[或者用户重载<<运算符]
printNode(pCurrent);
pCurrent=pCurrent->next;
}
}
void LinkList::clearLinkList()
{
//直接将链表大小归0,head->next置NULL
size=0;
head->next=NULL;
}
Person::Person(string name, int age)
{
this->name=name;
this->age=age;
}
int main()
{
//初始化数据
Person p1("A",10);
Person p2("B",20);
Person p3("C",30);
Person p4("D",40);
Person p5("E",50);
Person p6("A",10);
//初始化链表
LinkList list;
//插入数据
list.insertNode(0,(LinkNode*)&p1);
list.insertNode(0,(LinkNode*)&p2);
list.insertNode(0,(LinkNode*)&p3);
list.insertNode(0,(LinkNode*)&p4);
list.insertNode(0,(LinkNode*)&p5);
list.printLinkList(printNode);
cout<<"-----------------------------------------"<<endl;
list.deleteNode(1);
list.printLinkList(printNode);
cout<<"-----------------------------------------"<<endl;
cout<<list.queryNode((LinkNode*)&p6,compareNode)<<endl;
cout<<"-----------------------------------------"<<endl;
list.clearLinkList();
list.printLinkList(printNode);
return 0;
}
运行结果