数据结构笔记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("对不起,该元素不存在!\n");
  return ENDFlAG;//0
 }
 else{
  printf("该元素的位置为:%d\n",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("双向链表的操作开始!\n");
 printf("请输入你要建立的个数:");
 scanf("%d",&i);
 if(1!=InitLinkList_Asighment(h,i)){
  printf("建立失败,按任意键退出!\n");
  getch();
  exit(ERROR);
 }
 else{
  printf("建立成功!\n");
  printf("是否进行查找操作?1-是\n");
  printf("请输入你的选择:"); 
 }
 scanf("%d",&j);
 if(j==1)
  goto locate;
 else{
  printf("是否进行插入操作?1-是\n");
  printf("请输入你的选择:");
 }
 scanf("%d",&j);
 if(j==1)
  goto insert;
 else{
  printf("是否进行删除操作?1-是\n");
  printf("请输入你的选择:");
 }
 scanf("%d",&j);
 if(j==1)
  goto delet;
 else{
  printf("双向链表操作测试结束,按任意键退出!\n");
  getch();
  exit(0);
 }
 locate:
  if(1!=DLinkListLocate(h,e)){
   printf("查找失败!\n");
   goto insert;
  }
 insert:
  if(1!=DLinkListInsert(h,i,e)){
   printf("插入失败!\n");
   goto delet;
  }
 delet:
  if(1!=DLinkListDelet(h,i)){
   printf("删除失败!按任意键退出!\n");
   getch();
   exit(OVERFLOW);
  }
 printf("双向链表操作测试结束!\n");
 return 0;
}

采用尾插法

时间: 2024-08-08 22:24:19

数据结构笔记4双向链表的相关文章

20、蛤蟆的数据结构笔记之十九双向链表

20.蛤蟆的数据结构笔记之十九双向链表 本篇名言:"人的生命,似洪水奔流,不遇着岛屿和暗礁,难以激起美丽的浪花." 之前实现的都是单向列表,那么我们来看下双向链表. 欢迎转载,转载请标明出处: 1.  双向链表 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. 2.  定义结构体 typedef struct DoubleLinked

42. 蛤蟆的数据结构笔记之四十二图的遍历之广度优先

42. 蛤蟆的数据结构笔记之四十二图的遍历之广度优先 本篇名言:"生活真象这杯浓酒 ,不经三番五次的提炼呵 , 就不会这样一来可口 ! -- 郭小川" 继续看下广度优先的遍历,上篇我们看了深度遍历是每次一个节点的链表是走到底的. 欢迎转载,转载请标明出处:http://write.blog.csdn.net/postedit/47029275 1.  原理 首先,从图的某个顶点v0出发,访问了v0之后,依次访问与v0相邻的未被访问的顶点,然后分别从这些顶点出发,广度优先遍历,直至所有的

48. 蛤蟆的数据结构笔记之四十八的有向无环图的应用关键路径

48. 蛤蟆的数据结构笔记之四十八的有向无环图的应用关键路径 本篇名言:"富贵不淫贫贱乐 ,男儿到此是豪雄.-- 程颢" 这次来看下有向无环图的另一个应用关键路径. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47135061 1.  关键路径 与AOV-网相对应的是AOE-网(Activity On Edge)即边表示活动的网.AOE-网是一个带权的有向无环图,其中,顶点表示事件(Event),弧表示活动,权表

49. 蛤蟆的数据结构笔记之四十九图的连通性问题

49. 蛤蟆的数据结构笔记之四十九图的连通性问题 本篇名言:"我们不得不饮食.睡眠.游惰.恋爱,也就是说,我们不得不接触生活中最甜蜜的事情:不过我们必须不屈服于这些事物 .....--约里奥?居里"     此篇就作为数据结构入门笔记的最后一篇吧. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47135259 设图G=(V,E)是一个无向图,G的一个连通分支是一个最大的连通子图,即一个连通分支是不包含在任何更大的

46. 蛤蟆的数据结构笔记之四十六普里姆算法

46. 蛤蟆的数据结构笔记之四十六普里姆算法 本篇名言:"手莫伸 ,伸手必被捉.党与人民在监督 ,万目睽睽难逃脱.汝言惧捉手不伸 ,他道不伸能自觉 , 其实想伸不敢伸 ,人民咫尺手自缩.-- 陈毅" 连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边.所谓的最小成本,就是n个顶点,用n-1条边把一个连通图连接起来,并且使得权值的和最小.构造连通网的最小代价生成树,即最小生成树(Minimum Cost Spanning Tree). 找连通图的最

44. 蛤蟆的数据结构笔记之四十四弗洛伊德Floyd算法

44. 蛤蟆的数据结构笔记之四十四弗洛伊德Floyd算法 本篇名言:"希望是厄运的忠实的姐妹. --普希金" 我们继续来看下数据结构图中的一个算法,这个算法来自图灵奖得主. 1.  Floyd算法介绍 Floyd算法又称为插点法,是一种用于寻找给定的加权图中多源点之间最短路径的算法.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名.注意这个可不是心理学的那个弗洛伊德. 是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径

41 蛤蟆的数据结构笔记之四十一图的遍历之深度优先

41  蛤蟆的数据结构笔记之四十一图的遍历之深度优先 本篇名言:"对于我来说 , 生命的意义在于设身处地替人着想 , 忧他人之忧 , 乐他人之乐. -- 爱因斯坦" 上篇我们实现了图的邻接多重表表示图,以及深度遍历和广度遍历的代码,这次我们先来看下图的深度遍历. 欢迎转载,转载请标明出处: 1.  原理 图遍历又称图的遍历,属于数据结构中的内容.指的是从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次.图的遍历操作和树的遍历操作功能相似.图的遍历是图的一种基本操作,图的许多其它

33. 蛤蟆的数据结构笔记之三十三广义表实现二

33. 蛤蟆的数据结构笔记之三十三广义表实现二 本篇名言:" 希望是附丽于存在的,有存在,便有希望,有希望,便是光明.--鲁迅" 我们继续来看下广义表的其他代码实现.代码均来自网络,解释来自蛤蟆,均亲测可行. 欢迎转载,转载请标明出处: 1.  广义表实现二 1.1         main 创建两个链表的指针head和L. 输入一个字符串,调用GLCreate函数创建广义表.显示,获取头表,尾表,输出长度,深度,原子个数,复制列表,Merge列表,遍历,比较广义表操作. 如下图1:

34. 蛤蟆的数据结构笔记之三十四树的概念

34. 蛤蟆的数据结构笔记之三十四树的概念 本篇名言:"过去属于死神,未来属于你自己.--雪莱" 本篇笔记开始我们要进入新的概念了,树!是不是有点小激动呢?让我们从概念开始吧 当然概念要理解,如果当前不能立刻理解,可以后续结合代码一起理解效果更佳. 1.  树型结构 之前我们学习的那么多,其实都是线性数据结构. 树 则不同,它是非线性结构. 树形结构指的是数据元素之间存在着"一对多"的树形关系的数据结构,是一类重要的非线性数据结构.在树形结构中,树根结点没有前驱结点