#include<stdlib.h>
#include<stdio.h>
struct dlist //雙向鏈表結(jié)構(gòu)聲明
{
int data;
struct dlist *front;//指向下一結(jié)點(diǎn)的指針
struct dlist *back; //指向前一結(jié)點(diǎn)的指針
};
typedef struct dlist dnode;//雙向鏈表新類型
typedef dnode *dlink;//雙向鏈表指針新類型
void printdlist(dlink head)
{
while (head!=NULL)
{
printf("[%d]",head->data);
head=head->front;
}
printf("\n");
}
//雙向鏈表結(jié)點(diǎn)的插入
dlink insertnode(dlink head,dlink ptr,int value)
{
dlink new_node;
//創(chuàng)建新結(jié)點(diǎn),分配結(jié)點(diǎn)內(nèi)存
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)
{
//第一種情況:插在第一個結(jié)點(diǎn)之前,成為鏈表開始
new_node->front=head;
head->back=new_node;
head=new_node;
}
else
{
if(ptr->front == NULL)
{
//第二種情況:插在鏈表的最后
ptr->front=new_node;//最后結(jié)點(diǎn)指向新結(jié)點(diǎn)
new_node->back=ptr;//新結(jié)點(diǎn)指回最后結(jié)點(diǎn)
}
else
{
//第三種情況:插入結(jié)點(diǎn)至鏈表中間結(jié)點(diǎn)內(nèi)
ptr->front->back=new_node;//下一結(jié)點(diǎn)指回新結(jié)點(diǎn)
new_node->front=ptr->front;//新結(jié)點(diǎn)指向下一結(jié)點(diǎn)
new_node->back=ptr; //新結(jié)點(diǎn)指回插入結(jié)點(diǎn)
ptr->front=new_node; //插入結(jié)點(diǎn)指向新結(jié)點(diǎn)
}
}
return head;//返回鏈表起始指針
}
//主程序:使用插入結(jié)點(diǎn)的方式來創(chuàng)建鏈表,完成后將鏈表內(nèi)容輸出
void main()
{
dlink head = NULL;//循環(huán)鏈表指針
dlink tail = NULL;//鏈表最后的指針
int list[6]={1,2,3,4,5,6};
int i;
head = insertnode(head,head,list[0]);
printdlist(head);
tail = head;//保留鏈表最后指針
//第一種情況:插在第一個結(jié)點(diǎn)之前
head=insertnode(head,NULL,list[1]);
printdlist(head);
//第二種情況:插在鏈表的最后
head = insertnode(head,tail,list[2]);
printdlist(head);
for(i=3;i<6;i++)
{
//第三種情況:插入結(jié)點(diǎn)至鏈表中間結(jié)點(diǎn)內(nèi)
head = insertnode(head,head,list[i]);
printdlist(head);
}
}