#include<stdio.h>
#include<malloc.h>
#include<conio.h>
#define OK 1
#define ERROR -1
#define OVERFLOW -2
#define ENDFlAG 0
//双向链表节点
struct DNode{
int data;
struct DNode *prior,*next;
}DNode,*DLinkList;
//初始化以及建立,采用尾插法,返回1
int InitLinkList_Asighment(DLinkList h,int i){
DNode *p,*q;
h = (DNode *)malloc(sizeof(DNode));
h->next=NULL;
p=h;//p为终端节点指针
p->next=NULL;
//初始化成功
int x;
for(;i>0;i--){//执行赋值操作
scanf("%d",&x);
q=(DNode *)malloc(sizeof(DNode));
q->data=x;
q->next=p->next;
p->next=q;
p=q;
}
p->next=NULL;
return OK;//1
}
//插入操作,返回1
int LinkList_Insert(DLinkList h,int i,int e){
DLinkList p,s;//s为插入的节点
p=h->next;
int temp;
for(temp=1;temp<i-1;temp++)
p=p->next;
s=(DNode *)malloc(sizeof(DNode));
s->data=e;
p->next->prior=s;
s->prior=p;
p->next=s;
return OK;
}
//查找操作,返回1-yes 0-no
int DLinkList_Locate(DLinkList h,int e){
DLinkList p;//p为索引
p=h->next;
int i;
while(p!=NULL&&p->data!=e){}//此条件不能反过来
++i; //否则p为空时,p->data会出错
p=p->next;
}
if(p==NULL){
printf("对不起,该元素不存在! ");
return ENDFlAG;//0
}
else{
printf("该元素的位置为:%d ",i);
return OK;
}
}
//删除操作,返回1-yes 0-no
int DLinkList_Delet(DLinkList h,int i){
int temp=1;
DLinkList p;//索引
p->next=NULL;
while((temp++)!=i&&p!=NULL)
p=p->next;
if(p==NULL){
printf("该位置不存在,删除失败!");
return ENDFlAG;//0
}
else if(p->next==NULL){}//最后一个节?
p->prior->next=NULL;
free(p);
printf("删除成功!");
return OK;
}
else{
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
printf("删除成功!");
return OK;
}
}
//主函数
int main(){
DLinkList h;
int i,e;
int j;
printf("双向链表的操作开始! ");
printf("请输入你要建立的个数:");
scanf("%d",&i);
if(1!=InitLinkList_Asighment(h,i)){
printf("建立失败,按任意键退出! ");
getch();
exit(ERROR);
}
else{
printf("建立成功! ");
printf("是否进行查找操作?1-是 ");
printf("请输入你的选择:");
}
scanf("%d",&j);
if(j==1)
goto locate;
else{
printf("是否进行插入操作?1-是 ");
printf("请输入你的选择:");
}
scanf("%d",&j);
if(j==1)
goto insert;
else{
printf("是否进行删除操作?1-是 ");
printf("请输入你的选择:");
}
scanf("%d",&j);
if(j==1)
goto delet;
else{
printf("双向链表操作测试结束,按任意键退出! ");
getch();
exit(0);
}
locate:
if(1!=DLinkListLocate(h,e)){
printf("查找失败! ");
goto insert;
}
insert:
if(1!=DLinkListInsert(h,i,e)){
printf("插入失败! ");
goto delet;
}
delet:
if(1!=DLinkListDelet(h,i)){
printf("删除失败!按任意键退出! ");
getch();
exit(OVERFLOW);
}
printf("双向链表操作测试结束! ");
return 0;
}
#include<malloc.h>
#include<conio.h>
#define OK 1
#define ERROR -1
#define OVERFLOW -2
#define ENDFlAG 0
//双向链表节点
struct DNode{
int data;
struct DNode *prior,*next;
}DNode,*DLinkList;
//初始化以及建立,采用尾插法,返回1
int InitLinkList_Asighment(DLinkList h,int i){
DNode *p,*q;
h = (DNode *)malloc(sizeof(DNode));
h->next=NULL;
p=h;//p为终端节点指针
p->next=NULL;
//初始化成功
int x;
for(;i>0;i--){//执行赋值操作
scanf("%d",&x);
q=(DNode *)malloc(sizeof(DNode));
q->data=x;
q->next=p->next;
p->next=q;
p=q;
}
p->next=NULL;
return OK;//1
}
//插入操作,返回1
int LinkList_Insert(DLinkList h,int i,int e){
DLinkList p,s;//s为插入的节点
p=h->next;
int temp;
for(temp=1;temp<i-1;temp++)
p=p->next;
s=(DNode *)malloc(sizeof(DNode));
s->data=e;
p->next->prior=s;
s->prior=p;
p->next=s;
return OK;
}
//查找操作,返回1-yes 0-no
int DLinkList_Locate(DLinkList h,int e){
DLinkList p;//p为索引
p=h->next;
int i;
while(p!=NULL&&p->data!=e){}//此条件不能反过来
++i; //否则p为空时,p->data会出错
p=p->next;
}
if(p==NULL){
printf("对不起,该元素不存在! ");
return ENDFlAG;//0
}
else{
printf("该元素的位置为:%d ",i);
return OK;
}
}
//删除操作,返回1-yes 0-no
int DLinkList_Delet(DLinkList h,int i){
int temp=1;
DLinkList p;//索引
p->next=NULL;
while((temp++)!=i&&p!=NULL)
p=p->next;
if(p==NULL){
printf("该位置不存在,删除失败!");
return ENDFlAG;//0
}
else if(p->next==NULL){}//最后一个节?
p->prior->next=NULL;
free(p);
printf("删除成功!");
return OK;
}
else{
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
printf("删除成功!");
return OK;
}
}
//主函数
int main(){
DLinkList h;
int i,e;
int j;
printf("双向链表的操作开始! ");
printf("请输入你要建立的个数:");
scanf("%d",&i);
if(1!=InitLinkList_Asighment(h,i)){
printf("建立失败,按任意键退出! ");
getch();
exit(ERROR);
}
else{
printf("建立成功! ");
printf("是否进行查找操作?1-是 ");
printf("请输入你的选择:");
}
scanf("%d",&j);
if(j==1)
goto locate;
else{
printf("是否进行插入操作?1-是 ");
printf("请输入你的选择:");
}
scanf("%d",&j);
if(j==1)
goto insert;
else{
printf("是否进行删除操作?1-是 ");
printf("请输入你的选择:");
}
scanf("%d",&j);
if(j==1)
goto delet;
else{
printf("双向链表操作测试结束,按任意键退出! ");
getch();
exit(0);
}
locate:
if(1!=DLinkListLocate(h,e)){
printf("查找失败! ");
goto insert;
}
insert:
if(1!=DLinkListInsert(h,i,e)){
printf("插入失败! ");
goto delet;
}
delet:
if(1!=DLinkListDelet(h,i)){
printf("删除失败!按任意键退出! ");
getch();
exit(OVERFLOW);
}
printf("双向链表操作测试结束! ");
return 0;
}
采用尾插法