程序功能:逆序建立一个双向链表,该链表从第二个结点至表尾递增有序,将第一个结点删除并插入到适当位置,使整个链表仍然递增有序。
如输入:5 4 2 1 3,则构成的双链表为:3 1 2 4 5,经过重构后得到有序的双链表:1 2 3 4 5
# include <stdlib.h>
# include <stdio.h>
# define OK 1
# define OVERFLOW 1
# define ERROR 0
typedef int ElemType;
typedef struct DuLNode {
ElemType data; // 数据域
struct DuLNode *prior; //指向前驱的指针域
struct DuLNode *next; //指向后继的指针域
}DuLNode,*DuLinkList;
void LinkListInit(DuLinkList &L){
L=new DuLNode;
if(!L)exit(OVERFLOW);
L->next=L->prior=NULL;
}
void CreateList_L(DuLinkList &L,int n) {//逆序输入n个数据元素,建立带头结点的双向链表
DuLNode *p;
LinkListInit(L); //建立空表
for(int i=n; i>0; --i){
p=new DuLNode;//新增结点
scanf("%d",&p->data); //输入元素值
if(L->next){
L->next->prior=p;
p->next=L->next;
L->next=p;
p->prior=L;
}
else{
p->next=L->next;
L->next=p;
p->prior=L;
}
}
}
/*
void CreateList(DuLinkList &L,int n){//顺序输入结点,建立双向链表
DuLNode *p,*r;
LinkListInit(L); //建立空表
r=L; //r始终指向表尾结点
for(int i=1; i<=n; i++){//n个借点的插入
p=new DuLNode;
scanf("%d",&p->data); //输入元素值
p->next=r->next;//插入到表尾
r->next=p;
p->prior=r;
r=p;
}
//r->next=NULL;
}
*/
void DispList_L(DuLinkList L) {
DuLNode *p;
for(p=L->next;p;p=p->next)printf("%d ",p->data);
printf("\n");
}
void insetnode(DuLinkList &L){//L为双向链表的头指针,第二个结点至表尾递增有序,将第一个结点删除并插入到适当位置,使整个链表仍然递增有序
DuLNode *p,*q,*r;
p=L->next;L->next=p->next;p->next->prior=L; //将链表的第一个结点摘下
q=L->next;//q为工作指针
r=L;//r指向q的前驱
while(q->next&&q->data<p->data){r=q;q=q->next;} //查找p应插入的位置
if(q->next){
q->prior->next=p;
p->prior=q->prior;
p->next=q;
q->prior=p;
}
else{//插在尾部
// q->next=r->next;
//r->next=q;
//q->prior=r;
p->next=q->next;
q->next=p;
p->prior=q;
}
}
int main(){
DuLinkList L;
DuLNode *p;
printf("逆位序输入5个元素,构成双向链表:从第2个元素起递增有序\n");
CreateList_L(L,5);
//CreateList(L,5)
printf("该双向链表为");
DispList_L(L);
printf("从构之后的双链表为");
insetnode(L);
DispList_L(L);
return 0;
}