#include<stdlib.h>
#include<stdio.h>
struct dlist //双向链表结构声明
{
int data;
struct dlist *front;//指向下一结点的指针
struct dlist *back; //指向前一结点的指针
};
typedef struct dlist dnode;//双向链表新类型
typedef dnode *dlink;//双向链表指针新类型
void printdlist(dlink head)
{
while (head!=NULL)
{
printf("[%d]",head->data);
head=head->front;
}
printf("\n");
}
//双向链表结点的插入
dlink insertnode(dlink head,dlink ptr,int value)
{
dlink new_node;
//创建新结点,分配结点内存
new_node=(dlink)malloc(sizeof(dnode));
if(!new_node)
return NULL;
new_node->data=value;
new_node->front=NULL;
new_node->back=NULL;
if(head == NULL)
return new_node;
if(ptr == NULL)
{
//第一种情况:插在第一个结点之前,成为链表开始
new_node->front=head;
head->back=new_node;
head=new_node;
}
else
{
if(ptr->front == NULL)
{
//第二种情况:插在链表的最后
ptr->front=new_node;//最后结点指向新结点
new_node->back=ptr;//新结点指回最后结点
}
else
{
//第三种情况:插入结点至链表中间结点内
ptr->front->back=new_node;//下一结点指回新结点
new_node->front=ptr->front;//新结点指向下一结点
new_node->back=ptr; //新结点指回插入结点
ptr->front=new_node; //插入结点指向新结点
}
}
return head;//返回链表起始指针
}
//主程序:使用插入结点的方式来创建链表,完成后将链表内容输出
void main()
{
dlink head = NULL;//循环链表指针
dlink tail = NULL;//链表最后的指针
int list[6]={1,2,3,4,5,6};
int i;
head = insertnode(head,head,list[0]);
printdlist(head);
tail = head;//保留链表最后指针
//第一种情况:插在第一个结点之前
head=insertnode(head,NULL,list[1]);
printdlist(head);
//第二种情况:插在链表的最后
head = insertnode(head,tail,list[2]);
printdlist(head);
for(i=3;i<6;i++)
{
//第三种情况:插入结点至链表中间结点内
head = insertnode(head,head,list[i]);
printdlist(head);
}
}