创建双向链表的算法——C语言实现
双向链表也叫双链表,是链表的一种,它的每个节点包含两个指针,分别指向直接后继和直接前驱(头节点的前驱指空,尾节点的后继指空)。所以,从双向链表中的任意一个非前驱非后继节点开始,都能很方便地访问它的前驱和后继节点。
实际上如果熟练掌握了单向链表的基本操作,双向链表的创建只是每次新建好一个节点后挂链的时候多操作一个指针而已。如果你单向链表的创建还不熟悉,可以看这篇文章中的方法:创建单向链表的三种算法
本文给出创建双向链表的C语言代码,然后在注释中对其进行简单分析。
#include<stdio.h>
#include <stdlib.h>
typedef struct Node{
int data;
struct Node *front,*next; //双向链表每个节点都有两个指针
}ElemSN;
ElemSN *CreatLink(int data[],int num)//创建双向链表
{
int i;
ElemSN *p=NULL,*q=NULL,*h=NULL;
for(i=0;i<num;i++){
p=(ElemSN *)malloc(sizeof(ElemSN));
p->next=NULL;
p->data=data[i];
if(!h){ //处理头节点
h=p;
h->front=NULL;//头节点的前驱为空
}
else{
q->next=p;
p->front=q;
}
q=p;
}
return h;
}
ElemSN *FindTail(ElemSN *h)//找到双向链表的尾节点
{
ElemSN *p=h;
while(p->next!=NULL){
p=p->next;
}
return p;
}
void PrintLink(ElemSN *h)//输出双向链表数据域的值
{
ElemSN *p=NULL;
for(p=h;p!=NULL;p=p->next){
printf("%d\t",p->data);
}
printf("\n双向链表顺序输出结束!\n");
}
void BackPrintLink(ElemSN *t)//逆序输出双向链表的值
{
ElemSN *p=NULL;
for(p=t;p!=NULL;p=p->front){
printf("%d\t",p->data);
}
printf("\n双向链表逆序输出结束!\n");
}
void FreeSpace(ElemSN *h)//释放malloc分配的空间
{
int i;
ElemSN *t = h;
while(t != NULL){
t = h;
h = h->next;
free(t);
}
}
int main(void)
{
ElemSN *head=NULL,*tail=NULL;
int data[8]={3,2,5,8,4,7,6,9};
int num=8;
head=CreatLink(data,num);
tail=FindTail(head);
printf("顺序输出链表值:\n");
PrintLink(head);
printf("逆序输出链表值:\n");
BackPrintLink(tail);
FreeSpace(head);
return 0;
}