#include <malloc.h>
#include <stdio.h>
//以下双向链表均带有头节点;头节点不存放数据,只起到带头作用。
typedef struct DLNode{
int data;
struct DLNode *prior;
struct DLNode *next;
}DLinkNode;
//双向链表的建立(正插入法)
DLinkNode * CreatDList(DLinkNode *DL,int n){
DL=(DLinkNode*)malloc(sizeof(DLinkNode));
DL->prior=NULL;
DL->next=NULL;
DLinkNode *p0=DL,*p;
int i;
for(i=n;i>0;--i){
p=(DLinkNode*)malloc(sizeof(DLinkNode));
printf("input the data:/n");
scanf("%d",&p->data);
p0->next =p;
p->prior=p0;
p0=p;
}
p0->next=NULL;
return DL;
}
//双向链表的测长
int GetLengthDList(DLinkNode *DL){
DLinkNode * p=DL->next;
int len=0;
while(p!=NULL ){
len++;
p=p->next ;
}
return len;
}
//双向链表的打印
void DisplayDList(DLinkNode *L){
struct DLNode *p=L->next ;
while(p!=NULL ){
printf("%d/n",p->data);
p=p->next ;
}
}
//在有序双向链表插入一个节点
DLinkNode* DLinkInsert(DLinkNode *DL,int element){
DLinkNode *p0,*p1=DL->next;
p0=(DLinkNode*)malloc(sizeof(DLinkNode));
p0->data=element;
if(p1==NULL){//L仅包含头节点,直接插入头节点后。
DL->next= p0;
p0->next=NULL;
p0->prior=DL;
return DL;
}
while(p1->next !=NULL && element>p1->data)
p1=p1->next;
if(element<=p1->data){//把p0插在p1的前面
p1->prior->next=p0;
p0->next=p1;
p0->prior=p1->prior;
p1->prior=p0;
}
else{//把p0插在p1的后面,也就是插在链表的末尾。
p1->next=p0;
p0->prior=p1;
p0->next=NULL;
}
return DL;
}
//删除双向链表中某一个节点
DLinkNode* DLinkDelete(DLinkNode *DL,int element){
DLinkNode *p1=DL->next;
if(p1==NULL){//L仅包含头节点,直接返回。
printf("The double list have nothing./n");
return DL;
}
while(p1->next !=NULL && element != p1->data)
p1=p1->next;
if(element==p1->data){
if(p1->next==NULL)//删除的节点为第一个或是最后一个。
p1->prior->next=NULL;
else{//删除的节点为中间节点。
p1->prior->next=p1->next;
p1->next->prior=p1->prior;
}
free(p1);
}
else{//未找到。
printf("%d have not been found!/n",element);
return DL;
}
return DL;
}
#include <stdio.h>
//以下双向链表均带有头节点;头节点不存放数据,只起到带头作用。
typedef struct DLNode{
int data;
struct DLNode *prior;
struct DLNode *next;
}DLinkNode;
//双向链表的建立(正插入法)
DLinkNode * CreatDList(DLinkNode *DL,int n){
DL=(DLinkNode*)malloc(sizeof(DLinkNode));
DL->prior=NULL;
DL->next=NULL;
DLinkNode *p0=DL,*p;
int i;
for(i=n;i>0;--i){
p=(DLinkNode*)malloc(sizeof(DLinkNode));
printf("input the data:/n");
scanf("%d",&p->data);
p0->next =p;
p->prior=p0;
p0=p;
}
p0->next=NULL;
return DL;
}
//双向链表的测长
int GetLengthDList(DLinkNode *DL){
DLinkNode * p=DL->next;
int len=0;
while(p!=NULL ){
len++;
p=p->next ;
}
return len;
}
//双向链表的打印
void DisplayDList(DLinkNode *L){
struct DLNode *p=L->next ;
while(p!=NULL ){
printf("%d/n",p->data);
p=p->next ;
}
}
//在有序双向链表插入一个节点
DLinkNode* DLinkInsert(DLinkNode *DL,int element){
DLinkNode *p0,*p1=DL->next;
p0=(DLinkNode*)malloc(sizeof(DLinkNode));
p0->data=element;
if(p1==NULL){//L仅包含头节点,直接插入头节点后。
DL->next= p0;
p0->next=NULL;
p0->prior=DL;
return DL;
}
while(p1->next !=NULL && element>p1->data)
p1=p1->next;
if(element<=p1->data){//把p0插在p1的前面
p1->prior->next=p0;
p0->next=p1;
p0->prior=p1->prior;
p1->prior=p0;
}
else{//把p0插在p1的后面,也就是插在链表的末尾。
p1->next=p0;
p0->prior=p1;
p0->next=NULL;
}
return DL;
}
//删除双向链表中某一个节点
DLinkNode* DLinkDelete(DLinkNode *DL,int element){
DLinkNode *p1=DL->next;
if(p1==NULL){//L仅包含头节点,直接返回。
printf("The double list have nothing./n");
return DL;
}
while(p1->next !=NULL && element != p1->data)
p1=p1->next;
if(element==p1->data){
if(p1->next==NULL)//删除的节点为第一个或是最后一个。
p1->prior->next=NULL;
else{//删除的节点为中间节点。
p1->prior->next=p1->next;
p1->next->prior=p1->prior;
}
free(p1);
}
else{//未找到。
printf("%d have not been found!/n",element);
return DL;
}
return DL;
}