链表的C语言实现之循环链表及双向链表

2016-02-19 20:52 77 1 收藏

今天图老师小编要跟大家分享链表的C语言实现之循环链表及双向链表,精心挑选的过程简单易学,喜欢的朋友一起来学习吧!

【 tulaoshi.com - 编程语言 】

一、循环链表
  
  循环链表是与单链表一样,是一种链式的存储结构,所不同的是,循环链表的最后一个结点的指针是指向该循环链表的第一个结点或者表头结点,从而构成一个环形的链。
  
  循环链表的运算与单链表的运算基本一致。所不同的有以下几点:
  
  1、在建立一个循环链表时,必须使其最后一个结点的指针指向表头结点,而不是象单链表那样置为NULL。此种情况还使用于在最后一个结点后插入一个新的结点。
  
  2、在判定是否到表尾时,是判定该结点链域的值是否是表头结点,当链域值等于表头指针时,说明已到表尾。而非象单链表那样判定链域值是否为NULL。
  
  二、双向链表
  
  双向链表其实是单链表的改进。
  
  当我们对单链表进行操作时,有时你要对某个结点的直接前驱进行操作时,又必须从表头开始查找。这是由单链表结点的结构所限制的。因为单链表每个结点只有一个存储直接后继结点地址的链域,那么能不能定义一个既有存储直接后继结点地址的链域,又有存储直接前驱结点地址的链域的这样一个双链域结点结构呢?这就是双向链表。
  
  在双向链表中,结点除含有数据域外,还有两个链域,一个存储直接后继结点地址,一般称之为右链域;一个存储直接前驱结点地址,一般称之为左链域。在c语言中双向链表结点类型可以定义为:
  
  typedef strUCt node
  {
  int data; /*数据域*/
  struct node *llink,*rlink; /*链域,*llink是左链域指针,*rlink是右链域指针*/
  }JD;
  当然,也可以把一个双向链表构建成一个双向循环链表。
  
  双向链表与单向链表一样,也有三种基本运算:查找、插入和删除。
  
  双向链表的基本运算:
  
  1、查找
  
  假若我们要在一个带表头的双向循环链表中查找数据域为一特定值的某个结点时,我们同样从表头结点往后依次比较各结点数据域的值,若正是该特定值,则返回指向结点的指针,否则继续往后查,直到表尾。
  
  下例就是应用双向循环链表查找算法的一个程序。
  
  #include <stdio.h>
  #include <malloc.h>
  #define N 10
  
  typedef struct node
  {
   char name[20];
   struct node *llink,*rlink;
  }stud;
  
  stud * creat(int n)
  {
   stud *p,*h,*s;
   int i;
   if((h=(stud *)malloc(sizeof(stud)))==NULL)
   {
  printf("不能分配内存空间!");
  exit(0);
   }
   h->name[0]=’

来源:http://www.tulaoshi.com/n/20160219/1624732.html

延伸阅读
节点类 #ifndef Node_H #define Node_H template class Type class Node //单链节点类 { public: Type data; NodeType *link; Node() : data(Type()), link(NULL) {} Node(const Type &item) : data(item), link(NULL) {} Node(const Type &item, NodeType *p) : data(ite...
虚拟链表和类链表可以很好地实现这一点 T. W. Burger Thomas Wolfgang Burger Consulting公司的老板 2000 年 9 月 内容: 简化的问题 C 代码解决方案 C++ 解决方案 小结 参考资源 作者简介 您是否做过这样一个项目,它要求您在内存中保存数目不定的若干不同对象?对于某些情况...
#include stdio.h #include stdlib.h  /*与malloc.h差不多*/ #include string.h #define maxlen 100 strUCt persons { char name[10]; /*定义结构体数组用于缓存数据*/  char addr[20];  char phnum[10];  }persons[maxlen]; ; ; ; typedef struct lnode{&...
在上一个教程中我们已经简单的阐述了什么是结构体了,为了进一部的学习结构体这一重要的知识点,我们今天来学习一下链表结构。 !-- frame contents -- !-- /frame contents -- 结构体可以看做是一种自定义的数据类型,它还有一个很重要的特性,就是结构体可以相互嵌套使用,但也是有条件的,结构体可以包含结构体指针,...
偶写了一个程序,它的功能是将链表、堆栈、和队列进行集合操作,可以处理一般的插入N个元素,删除N个元素,以及入栈出栈的问题。 --------本程序的最大的特点是能够准确的显示当前的集合操作的各个元素的状态,并且能够将队列的数据以堆栈的格式输出,同样也支持将堆栈的数据以队列的格式显示出来,报错功能也不错,程序的最后将我们开辟的...

经验教程

876

收藏

82
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部