链表是线性表的一种,所谓的线性表包含顺序线性表和链表,顺序线性表是用数组实现的,在内存中有顺序排列,通过改变数组大小实现。而链表不是用顺序实现的,用指针实现,在内存中不连续。意思就是说,链表就是将一系列不连续的内存联系起来,将那种碎片内存进行合理的利用,解决空间的问题。

所以,链表允许插入和删除表上任意位置上的节点,但是不允许随即存取。链表有很多种不同的类型:单向链表、双向链表及循环链表。

单向链表包含两个域,一个是信息域,一个是指针域。也就是单向链表的节点被分成两部分,一部分是保存或显示关于节点的信息,第二部分存储下一个节点的地址,而最后一个节点则指向一个空值。

单向链表的实现:

(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; 
}