本文目录一览

1,数据结构和链表有什么关系

亲~链表是数据结构的一种哦~是包含关系哦~亲~
就是头结点的next指向下一个结点并且能一直找到最后一个结点的链表。

数据结构和链表有什么关系

2,数据结构typedef 链表

LNode是指你定义的结点类型,就是大括号中的包含指针域和数值域的变量。 *LinkList是指你所定义的是一个链表不是单个结点。。 LinkList L; L = malloc(sizeof(LinkList)); 是指申请一个链表的头结点的空间,并使该链表的指针指向该结点。。。因为理论上说链表空间可以无限,即整个内存的空间都可以为其所用,所以无需提前指定链表空间大小也可以继续申请下一个结点的空间。。 LinkList L;是指定义一个链表。 L = malloc(sizeof(LinkList));是指为该链表申请头结点,并使该链表的指针指向该结点 LNode *p; p = malloc(sizeof(LNode)); 与上句不同,这句是指你申请一个结点的空间。 LNode *p;是先定义一个结点。p = malloc(sizeof(LNode));是指为该结点申请内存空间。。 注意一个结点和一个链表的区别就可以了。。

数据结构typedef 链表

3,数据结构的链表问题

List_INIT_SIZE,表示初始分配100个元素空间。 LIST_INCREMENT,表示当100个元素空间被用完了后每次的再分配的增量。100满了计算机自动去找一块能容纳110个元素的地址空间,把前100个元素COPY过去,释放原来100个元素的地址空间,修改Sqlist的指针指向新的内存地址。120,130。。。以此类推。为什么要这样呢?因为数组必须要是连续的内存地址,而原来100个元素的后面地址空间有可能被新的变量分配使用掉了。而每次我们增加10个元素。避免每增加一个元素就去COPY一次前面的元素。 length,表示线性表长度啦。就是装有的元素个数的。初始化为0,表示没有装有元素。 size,表示线性表大小啦。就是最大容量。比如:你的线性表有111个元素,那么容量就应该是120。为什么? 至于List_INIT_SIZE*sizeof(Elemtype),首先malloc的参数是以字节为单位。表示分配多少字节。Elemtype被定义为int类型,占4个字节。那么100个元素,每个元素4个字节总共该分配多少个字节呢?小学数学题吧!

数据结构的链表问题

4,数据结构单链表

#ifndef LISTNODE_H#define LISTNODE_Htemplate<typename NODETYPE>class ListNode friend class List<NODETYPE>; public: ListNode(const NODETYPE &); NODETYPE getData() const; private: NODETYPE data; ListNode<NODETYPE> *nextPtr;}; template<typename NODETYPE>ListNode<NODETYPE>::ListNode(const NODETYPE &info) :data(info),nextPtr(0)} template<typename NODETYPE>NODETYPE ListNode<NODETYPE>::getData() constreturn data;}#endif
上QQ 联系我

5,关于数据结构中链表的实现

链表是用结构体实现的(当然,用类也行)链表打个比方,就好比寻宝,根据藏宝图找到一个地址,到那个地址后,会有另一张藏宝图,指向下一个宝藏的位置。。链表分为单向链表和双向链表。顾名思义,单向链表就是你只能从一个链节找到下一个链节,而不能从这个链节回到上一个链节。而双向链表正反都可以。你知道结构体吧,里面可以认为打包一些你需要的数据。基于这个基础,你可以在里面放一个该类型的结构体的指针变量来存放下一个结构体的地址,然后再放一些你需要存的数据。这样一个一个安排好,用指针变量把他们连接起来,就组成了一个普通的单向链表。双向链表亦是如此,只不过多了一个指针记录前一个链节的地址。每一个结构体变量叫做链节,它的下一个链节叫子节点,上一个链节叫做父节点,类比二叉树。每一个链节的内容分为两部分,指针部分和数据部分,这个不难理解。链表由于是用指针连接起来的,所以麻烦就麻烦在这里,如果有一个小改动,比如加一个元素到某一个位置,就必须改动父节点、子节点的指针。添加节点、删除节点等操作各有不同,甚至两头的改动和中间的改动都需要分开写,这些都称作链表的维护。虽然有些复杂,但是掌握了原理之后其实非常简单。建立链表的步骤是:先写一个结构体类型,明确你这个链表都需要哪些东西。比如:struct ListList * p; // 指针,记录子节点的位置int value; // 数据成员,存放数据的变量};然后就可以建立链表了。List * head; // 首先申明一个头指针,记录链表的首地址,类似数组的首地址List * temp; // 一个临时变量,之后你会知道他的作用head = new List; // 然后就新建一个链节,用new来建立head->p = NULL; // 把不需要的指针NULL是好习惯head->value = 0; // 记录该节点的数据这样就完成了一个链表的第一个链节的建立。之后的建立完全类似:head->p = new List; // 再新建一个节点temp = head->p; // 让临时指针指向这个新建的节点,以后的操作就可以用temp完成了temp->p = NULL; // 尾指针赋值为NULLtemp->value = 1; // 记录该节点的数据。就是这样,每个节点里面都有一个指针指向下一个节点,最后一个节点的指针(尾指针)是NULL,意味着链表的结束。链表建立之后,你就可以从首节点一个一个找,直到找到你想找的节点了。短距离可以:head->p->p->……->value;很长的话就再用一个临时变量中转一下吧。

6,java里的链表指的是什么为什么需要链表

链表的确是一种数据结构.而数据结构就是一种存放数据的方式.链表就是和铁链相似的.一个接着一个.一个扣着一个.比如:1,后面接着是2,然后是3,是连续的.1,2,3,就是这个链表的节点,就是数据存放的地方再通俗点.大学的校园生活:班级是这样的.1年1班,1年2班,....1年10班.班级就是节点,而班级里的学生,就是数据.他们是连续存储的.但是内存分分配不是连续的.有时间看下,<数据结构>书上写的很好.我就说到这吧.
java中的集合类有很多种,每个都有自己的一些特点,推荐你专门在这方面研究一下,比方Vector,ArrayList,,LinkedList,Hashtable等,其中你问到的链表,是不是指LinkedList呢?LinkedList是集合类的一种,和其它集合类一样都用于存放未知内容和未知长度的数据或者说对象.由于LinkedList的内部实现是采用链表结构,所以它就取名为LinkedList当然ArrayList的内部实现是采用数组结构,所以它就取名为ArrayList,呵呵,很好理解吧.它们就相当于一个容器,跟数据一样,可以存放数据,但数组你必须在一开始就指定它里面的内容是什么类型的,比方你必须 int[] array; 而集合类就没有必要,只需要: Vector vector=new Vector();就可以,至于放里面存放数据就更简单了,它什么都可以放,只要是对象: String str="hello";vector.add(str);Integer i=10;vector.add(i);取数据的时候需要做类型强制转换,因为你放的时候没有强制指定类型:String str=(String)vector.get(0);String i=(Integer)vecotr.get(1); 其它几种集合类也和vector的用法接近,但有些会有些变化和特点, 集合类是java语言的一个重点学习项目,一定要深入了解,不要光从百度上搜,一定要自己多看书,多做实例. <<java核心技术卷I>>中有专门的一章重点讲解集合类
链表是一种重要的数据结构,在程序设计中占有很重要的地位。c语言和c++语言中是用指针来实现链表结构的,由于java语言不提供指针,所以有人认为在java语言中不能实现链表,其实不然,java语言比c和c++更容易实现链表结构。java语言中的对象引用实际上是一个指针(本文中的指针均为概念上的意义,而非语言提供的数据类型),所以我们可以编写这样的类来实现链表中的结点。 class node object data; node next;//指向下一个结点 } 将数据域定义成object类是因为object类是广义超类,任何类对象都可以给其赋值,增加了代码的通用性。为了使链表可以被访问还需要定义一个表头,表头必须包含指向第一个结点的指针和指向当前结点的指针。为了便于在链表尾部增加结点,还可以增加一指向链表尾部的指针,另外还可以用一个域来表示链表的大小,当调用者想得到链表的大小时,不必遍历整个链表。下图是这种链表的示意图: 链表的数据结构 我们可以用类list来实现链表结构,用变量head、tail、length、pointer来实现表头。存储当前结点的指针时有一定的技巧,pointer并非存储指向当前结点的指针,而是存储指向它的前趋结点的指针,当其值为null时表示当前结点是第一个结点。那么为什么要这样做呢?这是因为当删除当前结点后仍需保证剩下的结点构成链表,如果pointer指向当前结点,则会给操作带来很大困难。那么如何得到当前结点呢,我们定义了一个方法cursor(),返回值是指向当前结点的指针。类list还定义了一些方法来实现对链表的基本操作,通过运用这些基本操作我们可以对链表进行各种操作。例如reset()方法使第一个结点成为当前结点。insert(object d)方法在当前结点前插入一个结点,并使其成为当前结点。remove()方法删除当前结点同时返回其内容,并使其后继结点成为当前结点,如果删除的是最后一个结点,则第一个结点变为当前结点。 链表类list的源代码如下: import java.io.*; public class list /*用变量来实现表头*/ private node head=null; private node tail=null; private node pointer=null; private int length=0; public void deleteall() /*清空整个链表*/ head=null; tail=null; pointer=null; length=0; } public void reset() /*链表复位,使第一个结点成为当前结点*/ pointer=null; } public boolean isempty() /*判断链表是否为空*/ return(length==0); } public boolean isend() /*判断当前结点是否为最后一个结点*/ if(length==0) throw new java.lang.nullpointerexception(); else if(length==1) return true; else return(cursor()==tail); } public object nextnode() /*返回当前结点的下一个结点的值,并使其成为当前结点*/ if(length==1) throw new java.util.nosuchelementexception(); else if(length==0) throw new java.lang.nullpointerexception(); else node temp=cursor(); pointer=temp; if(temp!=tail) return(temp.next.data); else throw new java.util.nosuchelementexception(); } } public object currentnode() /*返回当前结点的值*/ node temp=cursor(); return temp.data; } public void insert(object d) /*在当前结点前插入一个结点,并使其成为当前结点*/ node e=new node(d); if(length==0) tail=e; head=e; } else node temp=cursor(); e.next=temp; if(pointer==null) head=e; else pointer.next=e; } length++; } public int size() /*返回链表的大小*/ return (length); } public object remove() /*将当前结点移出链表,下一个结点成为当前结点,如果移出的结点是最后一个结点,则第一个结点成为当前结点*/ object temp; if(length==0) throw new java.util.nosuchelementexception(); else if(length==1) temp=head.data; deleteall(); } else node cur=cursor(); temp=cur.data; if(cur==head) head=cur.next; else if(cur==tail) pointer.next=null; tail=pointer; reset(); } else pointer.next=cur.next; length--; } return temp; } private node cursor() /*返回当前结点的指针*/ if(head==null) throw new java.lang.nullpointerexception(); else if(pointer==null) return head; else return pointer.next; } public static void main(string[] args) /*链表的简单应用举例*/ list a=new list (); for(int i=1;i<=10;i++) a.insert(new integer(i)); system.out.println(a.currentnode()); while(!a.isend()) system.out.println(a.nextnode()); a.reset(); while(!a.isend()) a.remove(); } a.remove(); a.reset(); if(a.isempty()) system.out.println("there is no node in list \n"); system.in.println("you can press return to quit\n"); try system.in.read(); //确保用户看清程序运行结果 } catch(ioexception e) } } class node /*构成链表的结点定义*/ object data; node next; node(object d) data=d; next=null; } } 读者还可以根据实际需要定义新的方法来对链表进行操作。双向链表可以用类似的方法实现只是结点的类增加了一个指向前趋结点的指针。 可以用这样的代码来实现: class node object data; node next; node previous; node(object d) data=d; next=null; previous=null; } } 当然,双向链表基本操作的实现略有不同。链表和双向链表的实现方法,也可以用在堆栈和队列的实现中,这里就不再多写了,有兴趣的读者可以将list类的代码稍加改动即可。 如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!vaela

文章TAG:链表数据结构  数据结构和链表有什么关系  
没有了