链表是线性表的一种,所谓的线性表包含顺序线性表和链表,顺序线性表是用数组实现的,在内存中有顺序排列,通过改变数组大小实现。而链表不是用顺序实现的,用指针实现,在内存中不连续。意思就是说,链表就是将一系列不连续的内存联系起来,将那种碎片内存进行合理的利用,解决空间的问题。
所以,链表允许插入和删除表上任意位置上的节点,但是不允许随即存取。链表有很多种不同的类型:单向链表、双向链表及循环链表。
单向链表包含两个域,一个是信息域,一个是指针域。也就是单向链表的节点被分成两部分,一部分是保存或显示关于节点的信息,第二部分存储下一个节点的地址,而最后一个节点则指向一个空值。
单向链表的实现:
(1)单向链表的创建过程:
第一步:定义节点的数据结构;
第二步:创建一个空表。
第三步:利用malloc()向系统申请分配一个节点。
第四步:将新节点的指针成员赋值为空。若是空表,将新节点连接到表头;若是非空表,将新节点连接到表尾。
第五步:判断是否有后续节点,如有则转入第三步,否则结束。
(2)单向链表的输出过程:
第一步:找到表头。
第二步:若为非空表,则输出节点的值成员,是空表则退出。
第三步:跟踪链表,找到下一节点的地址。
/链表的建立,就相当于一个结点不断尾插/头插的过程/
//1.0正向建链
#include<stdio.h>
#include<stdlib.h>
#define N 5
typedef struct node{
int data;
struct node *next;
}ElemSN;
ElemSN *creatlink(int a[])
{
ElemSN *h,*tail,*p;
//创建头结点
h=tail=(ElemSN *)malloc(sizeof(ElemSN));
h->data=a[0];
h->next=NULL;
for(int i=1;i<N;i++){
p=(ElemSN *)malloc(sizeof(ElemSN));
p->data=a[i];
p->next=NULL;
tail->next=p;
tail=p;
}
return h;
}
void printlink(ElemSN *h)
{
ElemSN *p;
for(p=h;p!=NULL;p=p->next){
printf("%4d",p->data);
}
}
int main()
{
int a[N]={10,20,30,40,50};
ElemSN *head=NULL;
//正向创建单向链表
head=creatlink(a);
//输出单向链表
printlink(head);
return 0;
}
//2.0
#include<stdio.h>
#include<stdlib.h>
#define N 5
typedef struct node{
int data;
struct node *next;
}ElemSN;
ElemSN *creatlink(int a[])
{
ElemSN *h,*tail;
//创建头结点
h=tail=(ElemSN *)malloc(sizeof(ElemSN));
h->data=a[0];
h->next=NULL;
for(int i=1;i<N;i++){
tail=tail->next=(ElemSN *)malloc(sizeof(ElemSN));
tail->data=a[i];
tail->next=NULL;
}
return h;
}
void printlink(ElemSN *h)
{
ElemSN *p;
for(p=h;p!=NULL;p=p->next){
printf("%4d",p->data);
}
}
int main()
{
int a[N]={10,20,30,40,50};
ElemSN *head=NULL;
//正向创建单向链表
head=creatlink(a);
//输出单向链表
printlink(head);
return 0;
}
//3.0
#include<stdio.h>
#include<stdlib.h>
#define N 5
typedef struct node{
int data;
struct node *next;
}ElemSN;
ElemSN *creatlink(int a[])
{
ElemSN *h=NULL,*tail,*p;
//创建头结点
for(int i=0;i<N;i++){
p=(ElemSN *)malloc(sizeof(ElemSN));
p->data=a[i];
p->next=NULL;
if(!h) h=tail=p;
else tail=tail->next=p;
}
return h;
}
void printlink(ElemSN *h)
{
ElemSN *p;
for(p=h;p!=NULL;p=p->next){
printf("%4d",p->data);
}
}
int main()
{
int a[N]={10,20,30,40,50};
ElemSN *head=NULL;
//正向创建单向链表
head=creatlink(a);
//输出单向链表
printlink(head);
return 0;
}