• 数据结构笔记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;
    }
     
    采用尾插法
     
  • 相关阅读:
    九连环
    杨辉三角
    魔术师发牌问题(循环链表)
    Linux 技巧:让进程在后台可靠运行的几种方法
    博客新地址
    x&(-x)取x的最后一个1的证明
    c++对象模型布局分析
    c++ 子类要正确的调用父类构造函数
    hibernate ID 生成方式
    IOCP
  • 原文地址:https://www.cnblogs.com/100114jerro/p/4998740.html
Copyright © 2020-2023  润新知