1.从头部添加新节点
(1)注意写代码过程中的箭头符号,和说话过程中的指针指向。这是两码事,容易搞混。箭头符号实际上是用指针方式来访问结构体,所以箭头符号的实质是访问结构体中的成员。更清楚一点说程序中的箭头和链表的连接没有任何关系;链表中的节点通过指针指向来连接,编程中表现为一个赋值语句(用=来进行连接),实质是把后一个节点的首地址,赋值给前一个节点中的pNext元素做为值。
#include <stdio.h>
//构建一个链表的节点
struct node
{
int data; //有效数据
struct node* pNext; //指向下一个节点的指针
};
//创建一个链表的节点
//返回值:指针,指针指向我们本函数新创建的节点的首地址
struct node* creat_node(int data)
{
struct node* pHeader = NULL;
//每创建一个新的节点,把这个新的节点和它前一个节点关联起来
//创建一个链表节点
struct node* p = (struct node*)malloc(sizeof(struct node));
if(NULL == p)
{
printf("malloc failure\n");
return NULL;
}
memset(p, 0, sizeof(struct node));
//bzero(p, sizeof(struct node));
p->data = data;
p->pNext = NULL; //将来要指向下一个节点的首地址,实际操作时将下一个节点malloc返回的指针赋值给它
return p;
}
//尾部插入
//计算添加了新的节点后总共有多少个节点,然后把这个数写进节点中
void insert_tail(struct node* pH, struct node* new)
{
int count = 0;
//分两步完成插入
//第一步,先找到链表中最后一个节点
struct node* p = pH;
while(NULL != p->pNext) //由头指针向后便利,走到最后一个节点
{
p = p->pNext;
count++;
}
//第二部,将新节点插入到最后一个节点尾部
p->pNext = new; //新节点成为最后一个节点
pH->data = count + 1;
}
//从头部添加新节点
void insert_head(struct node* pH, struct node* new)
{
//新节点的next指向原来的第一个节点
new->pNext = pH->pNext; //pH->pNext是第一个节点的地址
//头结点的next指向新节点的地址
pH->pNext = new;
//头结点中的计数加1
pH->data += 1;
}
int main()
{
//头指针
//struct node* pHeader = NULL;
struct node* pHeader = creat_node(0);
insert_head(pHeader, creat_node(1));
insert_head(pHeader, creat_node(2));
insert_head(pHeader, creat_node(3));
/*pHeader = creat_node(1);
pHeader->pNext = creat_node(2);
pHeader->pNext->pNext = creat_node(3);*/
//访问链表中的各个节点的有效数据,这个访问必须注意不能使用p,p2,p3,只能使用pHeader
//访问链表的头结点有效数据
printf("beader data: %d\n", pHeader->data); //pHeader->data == p->data
//访问链表的第1个有效数据
printf("node2 data: %d\n", pHeader->pNext->data); //pHeader->data == p->data
//访问链表的第2个有效数据
printf("node3 data: %d\n", pHeader->pNext->pNext->data); //pHeader->data == p->data
//访问链表的第3个有效数据
printf("node3 data: %d\n", pHeader->pNext->pNext->pNext->data); //pHeader->data == p->data
return 0;
}