#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);
}
}