动态分配内存内存函数malloc 需要用到头文件#include 格式struct node *p=(struct node *)malloc(sizeof(struct node ));
返回值为动态分配内存的起始地址
1.正向建立链表 尾插法 尾动头不动
我们要正向建立链表的话就要知道新建立的节点的上一个节点,然后让一个节点指向它,因此我们可以考虑开一个结构体指针tail指向上一个节点,同时头指针 head(就是指向头节点的指针)保持不动,否则就找不到起始节点,第一次建立节点是由于没有上一个节点所以让头指针和tail指针都指向p ,head=NULL;//先让头指针指向空,借此判断是否为第一次建立节点,也可以避免如果没有建立节点,head进行后面的操作时为野指针。 同理tail也设置为NULL避免变为野指针 在节点的建立过程中应不断让指向上一个节点的tail指针指向的节点的next指针指向新建立的节点,tail->next=p,同时让tail指向新建立的节点p,因为,下一次建立时这个节点p就是相对于它的上一个节点
tail = p; struct node* p, * head = NULL, * tail = NULL;
while ()
{
p = (struct node*)malloc(sizeof(struct node)); p.datemate->xxx; p->next = NULL;
//此处设置p的next指向NULL;可以避免出现野指针,也可以使得链表的尾节点指向空。
if(head==NULL)//通过是否为NULL来判断节点是否为第一次建立
{
head=tail=p; //此时head和tail都指向头节点,在下一次建立时就不会进入这个判断。
}
else
{
tail->next = p;
tail = p;
}
}
2.头插法 头动尾不动 逆序建立链表
原理差不多不过少一个指针 让head指向NULL表示还未开始建立链表 然后head表示上一次建立的节点 然后让新建立的节点的next指针指向它,之后再将head指向新建立的节点。看起来就像是头指针一直在往前移动
struct node * p, * head = NULL, * tail = NULL;
while ()//循环条件
{
p = (struct node*)malloc(sizeof(struct node)); p.datemate = xxx; p->next = NULL;
接着判断是否为第一个建立的节点 if (head == NULL)
//通过是否为NULL来判断节点是否为第一次建立
{
head = p; //此时head和tail都指向头节点,在下一次建立时就不会进入这个判断。 }
else { p->next = head; head = p; }
}