链表的组成
链表是由一个个节点组成,节点中包括有效数据和指针,有效数据就是需要存的数据,指针是为了指向下一个节点,从而使得一个个节点连接起来
创建一个单链表
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct node //定义一个结构体用来创建链表节点
{
int date;
struct node *pnext;
};
struct node* create_node(int date) //定义一个函数用来创建节点,返回值为struct node*类型
{
struct node* p=(struct node*)malloc(sizeof(struct node));//向堆内存申请内存用来存放这个节点
if(NULL==p) //检验malloc是否申请成功
printf("malloc error.\n");
bzero(p,sizeof(struct node));//初始化申请到的内存
p->date=date; //把函数传参的date写入节点
p->pnext=NULL; //节点中的指针指向空
}
int main(void)
{
struct node* pHeader=NULL;//定义一个头指针
pHeader=create_node(1); //让头指针指向第一个节点
pHeader->pnext=create_node(2); //利用头指针指向第一个节点的指针指向第二个节点
pHeader->pnext->pnext=create_node(3); //利用头指针指向第一个节点的指针指向第二个节点的指针指向第三个节点
printf("node1 date=:%d.\n",pHeader->date);//打印第一个节点存的数据
printf("node2 date=%d.\n",pHeader->pnext->date);//打印第二个节点存的数据
printf("node3 date=:%d.\n",pHeader->pnext->pnext->date);//打印第三个节点存的数据
}
输出结果:
node1 date=:1.
node2 date=2.
node3 date=:3.
链表的尾部插入:
实现原理是先找到链表的最后一个节点,然后把最后一个节点的指针指向要插入的那个节点
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct node
{
int date;
struct node* pnext;
};
struct node* create_node(int date)
{
struct node *p=(struct node*)malloc(sizeof(struct node));
if(NULL==p)
printf("malloc error.\n");
bzero(p,sizeof(struct node));
p->date=date;
p->pnext=NULL;
}
void insert_tail(struct node*PH,struct node* new)//第一个参数是头指针,第二个参数是插入的节点中的那个指针
{
struct node *p=PH; //定义一个局部变量p指向头指针
while(NULL!=p->pnext) //找最后一个节点
{
p=p->pnext; //往后走一个节点
}
p->pnext=new; //让最后一个节点的指针指向要插入的那个节点
}
int main(void)
{
struct node* pHeader=create_node(1);
insert_tail(pHeader,create_node(2));
insert_tail(pHeader,create_node(3));
printf("node1 date=:%d.\n",pHeader->date);
printf("node2 date=:%d.\n",pHeader->pnext->date);
printf("node3 date=:%d.\n",pHeader->pnext->pnext->date);
}
输出结果为:
node1 date=:1.
node2 date=2.
node3 date=:3.
链表的遍历:
void bianli(struct node* PH)
{
struct node* p=PH;
while(NULL!=p->pnext) //一直到最后一个节点指针指向NULL一直执行下面语句进行输出
{
p=p->pnext; //走向下一个节点
printf("node date=:%d.\n",p->date); //输出当前节点的数据
}
}