什么是单链表
线性表的链式结构特点是用一组任意的的存储单元存储线性表的数据元素(存储单元可以不连续),因此为了表示ai与他的后继元素ai+1之间的关系,每个元素除了存储本身的信息之外应该还存储一个指向后继元素的信息,这两部分合起来叫做结点,其中存储信息的叫做数据域,存储后继元素信息的叫做指针域,n个结点的链构成链表即为线性表的链式存储结构,又因为每个结点只包含一个指针域,故又称为单链表或线性链表
一、单链表的头插法
头插法的含义为每次新增的结点总在头部
关键代码为:
p->next=head;
head=p;
含义为p的后继元素指向head 然后把p的值赋给head 这样当下一个p被创建后指向的元素即为上一个p并且这个新创建的p变成了头结点
循环此步骤便可源源不断的创建新节点
需要注意的是head初始指向应为NULL,不然后续访问链表在最后一个结点时会难以判断
全代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
typedef struct lianbiao
{
int data;
struct lianbiao *next;
}hh;
hh *head,*p;
int e;
head->next=NULL;
scanf("%d",&e);
while(e!=0)
{
p=(hh*)malloc(sizeof(hh));
p->data=e;
p->next=head;
head=p;
scanf("%d",&e);
}
while(p->next!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
这里输入停止的条件为e=0 这个条件可以自由更改
二、单链表的尾插法
同理的尾插法的含义为每次新增的结点总在尾部
关键代码如下:
tall->next=p;
tall=p;
含义为tall指向的元素为p 然后再把p赋给tall 这样当一个新的p被创建时上个p总会指向这个新的p 并且这个新的p会作为尾结点。
循环此步骤便可源源不断的创建新节点。
这里需要注意的时我们需要在一开始就记录首结点的位置,不然后面难以访问
全代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
typedef struct lianbiao
{
int data;
struct lianbiao *next;
}hh;
hh *head,*tall,*p,*p1;
int e;
scanf("%d",&e);
p=(hh*)malloc(sizeof(hh));
p->data=e;
tall->next=p;
tall=p;
head=tall;
scanf("%d",&e);
while(e!=0)
{
p=(hh*)malloc(sizeof(hh));
p->data=e;
tall->next=p;
tall=p;
scanf("%d",&e);
}
p->next=p1;
while(head->next)
{
printf("%d ",head->data);
head=head->next;
}
}