单链表的实现方式有很多,多数地方的代码不成体系,所以在此整理介绍一下,希望可以让你对单链表的知识有一个系统的认识。
大致说一下,单链表的结构是由指针将数据结点连接起来的数据结构,不同于数组,单链表是一种动态的数据结构,其结点在进行创建的时候,才进行内存的分配,而不是事先已经分配好的。
下面介绍单链表的创建过程。首先是定义结点的数据结构:
typedef struct node
{
int data;
struct node *next;
};
结点结构定义完成之后,进行单链表的创建,注意单链表最重要的是头结点,只有通过头结点,才可以实现对单链表的访问。单链表创建代码如下:
node* create()
{
node* head;
head = (node*)malloc(sizeof(node));
head->data=0;
head->next=nullptr;
int num=1;
while(num!=0)
{
cout << "Please input the data: ";
cin >> num;
if(0==num)break;
//instNodeHead(head, num);
instNodeTail(head, num);
}
return head;
}
上述在进行单链表创建的时候,涉及到在单链表中插入数据的方式,有两种插入方式,头插入与尾插入,我分别创建了两个函数,以实现结点的插入:
1:头插法 instNodeHead(head,num);
2:尾插法 instNodeTail(head,num);
单链表头插法代码:
void instNodeHead(node* head, int num_inst)
{
node* p0;
p0 = (node*)malloc(sizeof(node));
p0->data=num_inst;
p0->next=head->next;
head->next=p0;
}
单链表尾插法代码:
void instNodeTail(node* head, int num_inst)
{
node *p0;
p0=(node*)malloc(sizeof(node));
p0->data=num_inst;
while(head->next!=nullptr)
{
head=head->next;
}
p0->next=head->next;
head->next=p0;
}
关于代码的具体应用,稍后再主函数中,我们会进行一一测试。下面介绍一下单链表结点删除操作:
void delNode(node* head, int num_del)
{
node *p0,*p1;
p0=head;
while(num_del!=p0->data && p0->next!=nullptr)
{
p1=p0;
p0=p0->next;
}
if(num_del==p0->data)
{
if(p0==head)
{
head=p0->next;
free(p0);
}
else{p1->next=p0->next;}
}
else{cout<<"could not found!!!"<<endl;}
}
void reverseNode(node* head)
{
node *p2,*p3;
int linkLength = length(head);
if(linkLength==1)return;
p2=head->next;head->next=nullptr;
while(p2)
{
p3=p2->next;
p2->next=head;
head=p2;
p2=p3;
}
}
void searchmid(node* head,node* mid)
{
node* temp=head;
while(head->next->next != nullptr)
{
head = head->next->next;
temp = temp->next;
mid = temp;
}
cout << "Middle data is: " << mid->data << endl;
}
打印单链表操作:
void print(node* head)
{
while(head->next!=nullptr)
{
cout << head->data << endl;
head=head->next;
}
cout << head->data << endl;
}
计算单链表的长度:
int length(node* head)
{
node* p0;
int nodeCnt=0;
p0=head;
while(p0!=nullptr)
{
nodeCnt++;
p0=p0->next;
}
return nodeCnt;
}
通过以上代码的编写,我再main()函数里面写了几段代码,对以上函数进行测试,下面是测试代码:
int main()
{
node *head,*midNode;
int linkLength=0;
head=create();
print(head);
searchmid(head, midNode);
int num_del;
cout<<"Please input number to delete: ";
cin>>num_del;
delNode(head,num_del);
print(head);
linkLength=length(head);
cout<<"LinkLength is: "<<linkLength<<endl;
reverseNode(head);
print(head);
return 0;
}