一:链表组成部分
链表由若干结点组成,每一结点又分为两部分:数据域和指针域。数据域用以存储数据元素,指针则存储下一结点(下一个数据)的地址,方便找到该数据。
struct Link{
int date;
struct Link *next;
};
二:链表的创建
1.尾插法创建
struct Link * create_Link_tail(struct Link *head)
{
struct Link* tail = (struct Link*)malloc(sizeof(Link));
tail = head;
int len;
cout<<"len:"<<endl;
cin>>len;
for(int i=0;i<len;++i)
{
struct Link* temp = (struct Link*)malloc(sizeof(Link));
cin>>temp->date;
tail->next=temp;
tail = temp;
}
tail->next =NULL;
return head;
}
创建一个与传入头指针完全一样的过度指针,始终指向新建结点temp(即始终指向链表末尾),就可以在不动头指针的前提下一只往头指针后面添加新结点。
2.头插法
struct Link* create_Link_head(struct Link* head)
{
int len;
cout<<"len:"<<endl;
cin>>len;
for(int i=0;i<len;++i)
{
struct Link* temp = (struct Link*)malloc(sizeof(Link));
cin>>temp->date;
temp->next = head->next;
head->next = temp;
}
return head;
}
新建结点的next指针指向head->next(也就是第一个Link结点),那该新建结点自然就成为了新的第一个结点,也就是head->next。
三:链表遍历
void traverse_Link(struct Link* head) //遍历链表
{
struct Link* ptr = (struct Link*)malloc(sizeof(Link));
ptr = head->next;
while(ptr!=NULL)
{
cout<<ptr->date<<endl;
ptr = ptr->next;
}
}
创建一个临时指针先指向head->next,即第一个元素,head是头不是首。然后通过while循环判断ptr是否为空,否就取出里面的date值,空即退出循环,遍历结束。
四:总结
链表及我上面的代码非常简单,很好看懂,如果看不懂,可以试试这个方法:假如创建一个结点:Link jiedian1;这个结点的下一个结点是jiedian2。死记:jiedian->next指的是jiedian2,即jiedian1->next->date就是jiedian2->date。记住了再去看看代码就显而易见了。
全部代码如下:
#include <iostream>
using namespace std;
struct Link{
int date;
struct Link *next;
};
struct Link * create_Link_tail(struct Link *head)
{
struct Link* tail = (struct Link*)malloc(sizeof(Link));
tail = head;
int len;
cout<<"len:"<<endl;
cin>>len;
for(int i=0;i<len;++i)
{
struct Link* temp = (struct Link*)malloc(sizeof(Link));
cin>>temp->date;
tail->next=temp;
tail = temp;
}
tail->next =NULL;
return head;
}
struct Link* create_Link_head(struct Link* head)
{
int len;
cout<<"len:"<<endl;
cin>>len;
for(int i=0;i<len;++i)
{
struct Link* temp = (struct Link*)malloc(sizeof(Link));
cin>>temp->date;
temp->next = head->next;
head->next = temp;
}
return head;
}
void traverse_Link(struct Link* head) //遍历链表
{
struct Link* ptr = (struct Link*)malloc(sizeof(Link));
ptr = head->next;
while(ptr!=NULL)
{
cout<<ptr->date<<endl;
ptr = ptr->next;
}
}
int main(int argc, char const *argv[])
{
struct Link *Head = (struct Link*)(malloc(sizeof(Link)));
create_Link_head(Head);
traverse_Link(Head);
return 0;
}