数据结构笔记4双向链表

#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;
}
 
采用尾插法
 
原文地址:https://www.cnblogs.com/100114jerro/p/4998740.html