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