1.在链表的尾部插入新节点
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//构建链表节点
struct node
{
int data; //有效数据
struct node *pNext; //指向下一个节点的指针
};
//函数功能,创建链表节点
//返回值:指针,指向我们本函数新创建的一个节点的首地址
struct node *creat_node(int data)
{
//创建一个链表节点
struct node *p = (struct node *)malloc(sizeof(struct node));
if(NULL == p)
{
printf("malloc error\n");
return NULL;
}
//清理申请到的堆内存
// void bzero(void *s, size_t n);
bzero(p,sizeof(struct node));
//填充节点
p->data = data;
p->pNext = NULL; //将来要指向下一个节点的首地址
return p;
}
//重尾部加入新节点
struct node *insert_tail(struct node *pH,struct node *new)
{
//第一步:先找到最后一个节点
struct node *p = pH;
while(NULL != p->pNext)
{
p = p->pNext; //往后走一个节点
}
p->pNext = new;
return new;
}
int main(void)
{
//定义头指针
//struct node *pHeader = NULL; 这里如果把pHeader赋值为NULL在加入节点这个函数内就会出现段错误
struct node *pHeader = creat_node(1);
insert_tail(pHeader,creat_node(2));
insert_tail(pHeader,creat_node(3));
insert_tail(pHeader,creat_node(4));
printf("node1 data = %d\n",pHeader->data);
printf("node2 data = %d\n",pHeader->pNext->data);
printf("node3 data = %d\n",pHeader->pNext->pNext->data);
return 0;
}
2.重链表头部插入新节点
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//构建链表节点
struct node
{
int data; //有效数据
struct node *pNext; //指向下一个节点的指针
};
//函数功能,创建链表节点
//返回值:指针,指向我们本函数新创建的一个节点的首地址
struct node *creat_node(int data)
{
//创建一个链表节点
struct node *p = (struct node *)malloc(sizeof(struct node));
if(NULL == p)
{
printf("malloc error\n");
return NULL;
}
//清理申请到的堆内存
// void bzero(void *s, size_t n);
bzero(p,sizeof(struct node));
//填充节点
p->data = data;
p->pNext = NULL; //将来要指向下一个节点的首地址
return p;
}
//重头部加入新节点
void insert_head(struct node *pH,struct node *new)
{
/* 方法一:
//第一步:新节点的pNext指向第一个节点
new->pNext = pH->pNext;
//第二部:头结点的pNext指向新节点
pH->pNext = new;
//第三部:头结点的计数加1
pH->data += 1;
*/
方法二:
//先保存第一个节点
struct node *p1 = pH->pNext;
//让头结点的pNext指向新节点
pH->pNext = new;
//新节点的pNext指向保存好的第一个节点
new->pNext = p1;
//头结点计数加1
pH->data += 1;
}
int main(void)
{
//定义头指针为空节点
struct node *pHeader = creat_node(0);
insert_head(pHeader,creat_node(1));
insert_head(pHeader,creat_node(2));
insert_head(pHeader,creat_node(3));
printf("header node data = %d\n",pHeader->data); //打印有多少个节点
printf("node1 data = %d\n",pHeader->pNext->data);
printf("node2 data = %d\n",pHeader->pNext->pNext->data);
printf("node3 data = %d\n",pHeader->pNext->pNext->pNext->data);
return 0;
}
注意:写代码过程中的箭头符号,和说话中的指向是两码事,箭头符号实际上是用指针方式来访问结构体,所以实质上箭头符号的实质是访问结构体中的成员。更清楚一点说程序中的箭头和链表的链接没有任何关系;链表中的节点通过指针指向来连接,编程中表现为一个赋值语句(用=号来连接),实质上是把最后一个节点的首地址,赋值给前一个节点的pNext元素作为值。